您的位置:首页 > 编程语言 > ASP

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

2015-06-13 22:16 1036 查看
示例代码

项目启动时,创建依赖注入容器

定义一静态容器 IWindsorContainer

private static IWindsorContainer _container;

在 Application_Start() 中,创建该容器

_container = new WindsorContainer();

调用 Container Install 方法,向容器内注册组件

_container.Install(FromAssembly.This());

该语句会调用整个程序集中所有实现了 IWindsorInstaller 接口类中的Install方法以向容器的注册组件。如下列代码:

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


特别列出向 Container 中注册 Controler 的代码:

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


[b]定义实现 IDependencyResolver 接口的 WindsorDependencyResolver 类,作为全局 HttpConfiguration 的 Resolver[/b]

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


[b]创建一新 IHttpControllerActivator,更改 Controller 创建方式为从容器 Container 中获取[/b]

实现 IHttpControllerActivator 接口 Create 方法

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

request.RegisterForDispose(
new Release(() => _container.Release(controller)));

return controller;
}


并且注册当 web request 被 Dispose 的时候,Dispose 该 Controller。

替换 Default IHttpControllerActivator 行为

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


[b]参考资料:[/b]

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: