[英]DependencyResolver + Owin + WebApi2
Owin的一大優勢是它不依賴於System.Web
。 如果WebApi顯然需要這些內容,我該如何設置DI:
var config = new HttpConfiguration();
var container = new WindsorContainer().Install(new ControllerInstaller());
container.Install(FromAssembly.This());
config.DependencyResolver = ...
config.DependencyResolver
需要具體來自System.Web.Http.Dependencies
的IDependencyResolver
?
我對使用WebApi + Owin + Castle.Windsor的C#代碼特別感興趣(谷歌還沒有多少幫助)。
我設法使用它:
[assembly: OwinStartup(typeof(Bla.Startup))]
namespace Bla
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
//...
var container = new WindsorContainer().Install(new ControllerInstaller());
var httpDependencyResolver = new WindsorHttpDependencyResolver(container);
config.DependencyResolver = httpDependencyResolver;
//...
}
}
public class ControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Pick().If(t => t.Name.EndsWith("Controller"))
.Configure(configurer => configurer.Named(configurer.Implementation.Name))
.LifestylePerWebRequest());
//...
}
}
internal class WindsorDependencyScope : IDependencyScope
{
private readonly IWindsorContainer _container;
private readonly IDisposable _scope;
public WindsorDependencyScope(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
_container = container;
_scope = container.BeginScope();
}
public object GetService(Type t)
{
return _container.Kernel.HasComponent(t)
? _container.Resolve(t) : null;
}
public IEnumerable<object> GetServices(Type t)
{
return _container.ResolveAll(t)
.Cast<object>().ToArray();
}
public void Dispose()
{
_scope.Dispose();
}
}
internal sealed class WindsorHttpDependencyResolver : IDependencyResolver
{
private readonly IWindsorContainer _container;
public WindsorHttpDependencyResolver(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
_container = container;
}
public object GetService(Type t)
{
return _container.Kernel.HasComponent(t)
? _container.Resolve(t) : null;
}
public IEnumerable<object> GetServices(Type t)
{
return _container.ResolveAll(t)
.Cast<object>().ToArray();
}
public IDependencyScope BeginScope()
{
return new WindsorDependencyScope(_container);
}
public void Dispose()
{
}
}
我面臨的問題是使用:
config.DependencyResolver = httpDependencyResolver;
引入了對system.web的依賴。 所以當我嘗試在某些整合測試中使用owin測試服務器時,我遇到了問題。 我會發布另一個問題。
看看這里 - “使用Mark Seemann的Castle Windsor的ASP.NET Web API中的依賴注入” 。 然后是Mark Seeman的博客檔案 。 他談了很多關於DI和WEB API的事情,他經常使用Castle Windsor。 我打賭Castle Windsor是他最喜歡的DI容器。 當你查看存檔時,不要只看WEB API。 有時他會發布不同標題下的WEB API。
如果您閱讀了他的優秀書籍,您將對IoC / DI的主題有很好的理解。 非常好的書。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.