您的位置:首页 > 运维架构

自己实现简单的AOP(五)使Demo适应webApi、亦可完成属性自动注入

2015-11-26 13:23 661 查看
在前文的Demo中,webApi的Controller是不能自动注入的,原因是 IHttpController 和 IController 是通过两个不同的途径进行激活的。

IHttpController的激活是通过 IHttpControllerActivator 接口完成的

// 摘要:
//     定义 System.Web.Http.Dispatcher.IHttpControllerActivator 所需的方法。
public interface IHttpControllerActivator
{
// 摘要:
//     创建一个 System.Web.Http.Controllers.IHttpController 对象。
//
// 参数:
//   request:
//     消息请求。
//
//   controllerDescriptor:
//     HTTP 控制器描述符。
//
//   controllerType:
//     控制器的类型。
//
// 返回结果:
//     System.Web.Http.Controllers.IHttpController 对象。
IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType);
}


而其默认实现类为:DefaultHttpControllerActivator

// 摘要:
//     表示 System.Web.Http.Dispatcher.IHttpControllerActivator 的默认实现。可以通过 System.Web.Http.Services.DependencyResolver
//     注册不同的实现。我们已针对每个 System.Web.Http.Controllers.HttpControllerDescriptor 实例具有一个
//     System.Web.Http.Controllers.ApiControllerActionInvoker 实例的情况进行优化,但也支持一个 System.Web.Http.Controllers.ApiControllerActionInvoker
//     具有多个 System.Web.Http.Controllers.HttpControllerDescriptor 实例的情况。对于后一种情况,查找会略慢一些,因为查找需要遍历
//     HttpControllerDescriptor.Properties 目录。
public class DefaultHttpControllerActivator : IHttpControllerActivator
{
// 摘要:
//     初始化 System.Web.Http.Dispatcher.DefaultHttpControllerActivator 类的新实例。
public DefaultHttpControllerActivator();

// 摘要:
//     使用给定 request 创建 controllerType 所指定的 System.Web.Http.Controllers.IHttpController。
//
// 参数:
//   request:
//     请求消息。
//
//   controllerDescriptor:
//     控制器描述符。
//
//   controllerType:
//     控制器的类型。
//
// 返回结果:
//     类型 controllerType 的实例。
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType);
}


知道了上述信息,最简单的办法就是继承并重写 DefaultHttpControllerActivator ,但是不巧的是其 Create 不是虚函数,不能重写。咋办法呢?变通一下,动态改变对象的行为——装饰模式。当然这里没必要严格按照装饰模式死板的去应用,完全没必要的。只需要按照装饰原理,将 DefaultHttpControllerActivator 进行装饰,再将装饰对象注册到系统中即可。

比如:

/// <summary>
/// 用于Web Api
/// </summary>
private class MyHttpControllerActivator : IHttpControllerActivator
{
private DefaultHttpControllerActivator defaultActivator;

public MyHttpControllerActivator()
{
this.defaultActivator = new DefaultHttpControllerActivator();
}

public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
IHttpController httpController = this.defaultActivator.Create(request, controllerDescriptor, controllerType);

if (httpController != null)
{
/// 自动装配属性
/// <para>为属性对象启用代理,并延迟初始化被代理的对象</para>
DelayProxyUtil.AutowiredProperties(httpController);
}

return httpController;
}
}


然后在 应用程序启动的时候进行注册:

// 使AOP适应 WebApi
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new MyHttpControllerActivator());


如此,WebApi中的Controller属性,也会被自动注入了。

源码地址:http://files.cnblogs.com/files/08shiyan/AOPDemo.zip

(暂完,后续补充中...)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: