ASP.NET Web API - 使用 Castle Windsor 依賴注入


示例代碼

項目啟動時,創建依賴注入容器

定義一靜態容器 IWindsorContainer

 1 private static IWindsorContainer _container; 

在 Application_Start() 中,創建該容器

 1 _container = new WindsorContainer(); 

 

調用 Container Install 方法,向容器內注冊組件

 1 _container.Install(FromAssembly.This()); 

該語句會調用整個程序集中所有實現了 IWindsorInstaller 接口類中的Install方法以向容器的注冊組件。如下列代碼:

1 public void Install(IWindsorContainer container, IConfigurationStore store)
2 {
3     container.Register(
4         Component.For<IDPlatypusRepository>().ImplementedBy<DPlatypusRepository>().LifestylePerWebRequest());
5 }

特別列出向 Container 中注冊 Controler 的代碼:

1 public void Install(IWindsorContainer container, IConfigurationStore store)
2 {
3       container.Register(Classes.FromThisAssembly()
4              .BasedOn<ApiController>().LifestylePerWebRequest());
5 }

 

定義實現 IDependencyResolver 接口的 WindsorDependencyResolver 類,作為全局 HttpConfiguration 的 Resolver

var dependencyResolver = new WindsorDependencyResolver(_container);
configuration.DependencyResolver = dependencyResolver;

 

創建一新 IHttpControllerActivator,更改 Controller 創建方式為從容器 Container 中獲取

實現 IHttpControllerActivator 接口 Create 方法

1 public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
2 {
3     var controller = (IHttpController)_container.Resolve(controllerType);
4 
5     request.RegisterForDispose(
6         new Release(() => _container.Release(controller)));
7 
8     return controller;
9 }

並且注冊當 web request 被 Dispose 的時候,Dispose 該 Controller。

替換 Default IHttpControllerActivator 行為

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator),
new WindsorCompositionRoot(container));

 

參考資料:

Simplest Possible ASP.NET Web API Project that Implements IoC/DI using Castle Windsor

http://www.codeproject.com/Articles/710662/Simplest-Possible-ASP-NET-Web-API-Project-that-Imp

WebAPI Dependency Injection

https://github.com/ucdavis/UCDArch/wiki/WebAPI-Dependency-Injection

Difference between inheriting ApiController vs. IHttpController

http://stackoverflow.com/questions/21464909/difference-between-inheriting-apicontroller-vs-ihttpcontroller

ASP.NET WEB API 2: HTTP MESSAGE LIFECYLE

http://www.asp.net/posters/web-api/asp.net-web-api-poster.pdf

使用 Castle Windsor 實現 Web API 依賴注入

http://beginor.github.io/2014/12/21/webapi-dependency-injection-with-castle-windsor.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM