簡體   English   中英

IoC:Castle Windsor和WebAPI

[英]IoC: Castle Windsor and WebAPI

我有一個使用Castle Windsor的MVC4站點,我想添加一些WebAPI調用,所以我開始在互聯網上挖掘一下。

現在我不知道IoC的來龍去脈; 我按照教程了解了如何在我的項目中設置Castle Windsor,將IUnitOfWorkFactoryIApplicationService注入基本控制器中的公共屬性,以及控制器構造函數中需要的一些其他接口。 它游泳,所以我從來沒有做過更多。

我正在WebAPI上讀到的任何地方,我被告知DI使用Castle Windsor無法正常工作,談論IDependencyResolverIDependencyScope 有幾種解決方法和實現如何解決這個問題,但我不清楚的是究竟是什么問題。 包含代碼片段,但假設您知道它們屬於哪個類,以及如何調用它們,遺憾的是我沒有。 另外,我在網上看到的所有例子都提到了一個獨家的WebAPI項目,而不是一個明智地拋出幾個ApiController的MVC4項目。我不知道這是怎樣的,或者是否會影響到任何東西。

為什么我的標准控制器無法使用API​​控制器? 為了讓WebAPI調用和標准Web調用在同一個應用程序中工作,需要做什么樣的代碼雜技?

要使用帶有webapi的Windsor,請訪問http://blog.ploeh.dk/2012/10/03/DependencyInjectioninASP.NETWebAPIwithCastleWindsor/(BEH:fixed link)

閱讀ASP.NET Web API中的Castle Windsor / DelegatingHandler / IPrincipal依賴注入(DI)/控制反轉(IoC)

您可以在同一個應用程序中使用webapi和MVC控制器(我更喜歡將它保持獨立)但路由和控制器工廠不同,您必須設置兩個不同的配置並處理路由重疊...對於MVC和Windsor,您可以找到一個大

現有Castle Windsor MVC配置

假設你有類似於Castle Windsor MVC教程的 MVC和Castle Windsor設置,使用Mark Seemann的帖子 (注意他解釋了為什么不使用IDependencyResolver) ,添加IoC以使Web API控制器利用依賴注入非常簡單。

從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()剪輯

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

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

所需的更改

從Mark Seemann的帖子中,您需要通過IHttpControllerActivator進入Web API的入口點(Composition Root) 這是他需要的適配器實現。

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));
    }

最后結果:

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" };
    }
}

以下示例項目給了我正在尋找的答案。 它使用Castle Windsor進行依賴注入。 我能夠在同一個應用程序上使用MVC控制器和Web API控制器。

mirajavora / WebAPISample


這是詳細說明的帖子:

ASP.NET Web API入門

首先,Iko聲明您需要創建一個實現IHttpControllerActivator的類。

然后在Bootstrap()中的ContainerBootstrapper中添加以下內容:將默認值替換為實現的默認值:

 //This will help in creating Web api with Dependency injection
 GlobalConfiguration.Configuration.Services.Replace(
 typeof(IHttpControllerActivator),
 new WindsorCompositionRoot(container));

最后這里沒有提到它,如果沒有它你不應該在你在install()實現IWindsorInstaller服務中添加以下內容:

container.Register(
    Classes.FromThisAssembly()
    .BasedOn<ApiController>()
    .LifestyleTransient()    
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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