CSharp - IoC: Castle Windsor 和 WebAPI

  显示原文与译文双语对照的内容

我有一个使用Castle Windsor MVC4站点,我想添加一些WebAPI调用周围,所以我开始挖一点单纯interwebs 。

而我不知道的输入与输出IoC,我跟踪的教程如何设置我的项目上Castle Windsor,注入 IUnitOfWorkFactoryIApplicationService作为公共属性在base控制器中,根据需要和一些其他接口控制器构造函数。 它swimmingly工作,因此我以前从没做得更好。

到处说我阅读了所有关于WebAPI,我告诉DI将不工作,因此我们使用Castle Windsor,谈论的问题 IDependencyResolverIDependencyScope. 方法有很多种和实现如何解决此问题,但这并不明确我的问题到底是什么。 包括代码段,但假设是你知道它们所属类,以及它们如何被调用,可惜我不。 此外,所有我见过在线的示例请参阅排他WebAPI项目,并不是一个MVC4项目与几个 ApiControllers 请慎重丢在。 我不知道,或者,这会影响什么。

为什么我所无法使用我的标准控制器不使用API控制器? acrobatics需要做什么样的代码才能使WebAPI调用和标准web调用操作在同一个应用程序?

时间: 原作者:

下面的示例项目中给了我答案我想要的人 在为依赖注入Castle Windsor工作。 我能够使用MVC Controllers Web API控制器在同一个Application旁边。

mirajavora / WebAPISample


以下是这篇文章详细说明了它:

Getting用ASP Started .NET Web API

原作者:

现有Castle Windsor MVC配置

假设你有MVC和Castle Windsor安装与一样 Castle Windsor MVC教程,添加IoC获取Web API控制器才能使用依赖注入非常简单与 Mark Seemann为post ( 注意,他解释了为什么不使用IDependencyResolver ) 。?

从Castle Windsor教程你应该像这样的东西在 Global.asax.cs.

    private static IWindsorContainer container;

    protected void Application_Start()
    {
        //... MVC / Web API routing etc.
        BootStrapper bs = new BootStrapper();
        container = bs.ConfigureCastleWindsorMVC();
    }

BootStrapper.ConfigureCastleWindsorMVC()sNIP

        IWindsorContainer container = new WindsorContainer()
            .Install(
                new LoggerInstaller()
                //...,
                , new ControllersInstaller()
            );

        var controllerFactory = new WindsorControllerFactory(container.Kernel);
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);
        return container;

需更改

从Mark Seemann为post需要进入Web API没有入口点( Composition root ) 通过 IHttpControllerActivator. 这是他所需的适配器实现。

public class WindsorCompositionRoot : IHttpControllerActivator
{
    private readonly IWindsorContainer container;

    public WindsorCompositionRoot(IWindsorContainer container)
    {
        this.container = container;
    }

    public IHttpController Create(HttpRequestMessage request,
        HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        var controller =
            (IHttpController)this.container.Resolve(controllerType);

        request.RegisterForDispose(
            new Release(() => this.container.Release(controller)));

        return controller;
    }

    private class Release : IDisposable
    {
        private readonly Action release;

        public Release(Action release) { this.release = release; }

        public void Dispose()
        {
            this.release();
        }
    }
}

与IHttpControllerActivator适配器和MVC Castle Windsor容器实现,你只需要将其配置在 Global.asax.cs( 或在BootStrapper如果用这个) 。 它必须MVC初始化MVC后初始化后的所有安装程序。

    private static IWindsorContainer container;

    protected void Application_Start()
    {
        // MVC / Web API routing etc.
        BootStrapper bs = new BootStrapper();
        container = bs.ConfigureCastleWindsorMVC();
        // Web API Castle Windsor ++ ADD THIS ++
        GlobalConfiguration.Configuration.Services.Replace(
            typeof(IHttpControllerActivator),
            new WindsorCompositionRoot(container));
    }

最后Result :

Web API控制器可以使用对注入依赖项与你自己的MVC控制器。

public class TestController : ApiController
{
    private readonly ITestService TestService;

    public TestController(ITestService testService)
    {
        this.TestService = testService;
    }

    // GET api/<controller>
    public IEnumerable<string> Get()
    {
        return TestService.GetSomething();
        //return new string[] { "value1", "value2" };
    }
}
原作者:
...