[英]IoC: Castle Windsor and WebAPI
我有一個使用Castle Windsor的MVC4站點,我想添加一些WebAPI調用,所以我開始在互聯網上挖掘一下。
現在我不知道IoC的來龍去脈; 我按照教程了解了如何在我的項目中設置Castle Windsor,將IUnitOfWorkFactory
和IApplicationService
注入基本控制器中的公共屬性,以及控制器構造函數中需要的一些其他接口。 它游泳,所以我從來沒有做過更多。
我正在WebAPI上讀到的任何地方,我被告知DI使用Castle Windsor無法正常工作,談論IDependencyResolver
和IDependencyScope
。 有幾種解決方法和實現如何解決這個問題,但我不清楚的是究竟是什么問題。 包含代碼片段,但假設您知道它們屬於哪個類,以及如何調用它們,遺憾的是我沒有。 另外,我在網上看到的所有例子都提到了一個獨家的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教程的 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控制器。
這是詳細說明的帖子:
首先,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.