簡體   English   中英

DependencyResolver + Owin + WebApi2

[英]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.DependenciesIDependencyResolver

我對使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM