首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DependencyResolver + Owin + WebApi2

DependencyResolver + Owin + WebApi2
EN

Stack Overflow用户
提问于 2014-08-21 08:26:42
回答 2查看 6.5K关注 0票数 6

Owin的最大优点之一是它不依赖System.Web。如果WebApi显然需要这样的内容,那么我到底该如何设置DI:

代码语言:javascript
复制
var config = new HttpConfiguration();
var container = new WindsorContainer().Install(new ControllerInstaller());
container.Install(FromAssembly.This());
config.DependencyResolver = ...

其中config.DependencyResolver需要一个来自System.Web.Http.Dependencies的具体的IDependencyResolver

我特别感兴趣的是C#代码,它使用了WebApi + Owin + Castle.Windsor (谷歌对此帮助不大)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-22 08:07:03

我已经设法让它使用了:

代码语言:javascript
复制
[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()
    {
    }
}

我所面临的问题是使用:

代码语言:javascript
复制
config.DependencyResolver = httpDependencyResolver;

引入对system.web的依赖关系。因此,当我试图在一些整数测试中使用owin时,我会遇到一些问题。我会提出另一个问题。

票数 7
EN

Stack Overflow用户

发布于 2014-08-22 05:27:35

看看这里- “Mark在ASP.NET Web中的依赖注入与城堡温莎”。然后在马克·西曼的博客档案。他讲了很多关于DI和WEB的内容,并且经常使用。我打赌城堡温莎是他最喜欢的DI容器。当您查看存档时,不要只查看WEB。有时,他在不同标题下发布关于WEB的文章。

如果你读了他那本好书,你就会对IoC/DI这个话题有很好的理解。很好的书。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25421610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档