既存のキャッスル ウィンザー MVC 構成
Castle Windsor MVC チュートリアルと同様に MVC と Castle Windsor がセットアップされていると仮定すると、IoC を追加して依存性注入を利用する Web API コントローラーを取得することは、Mark Seemann の投稿 (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()
をちょきちょきと切る
IWindsorContainer container = new WindsorContainer()
.Install(
new LoggerInstaller()
//...,
, new ControllersInstaller()
);
var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
return container;
必要な変更
Mark Seemann の投稿から、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 キャッスル ウィンザー コンテナーの実装を使用すると、それを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" };
}
}