自己实现简单的AOP(五)使Demo适应webApi、亦可完成属性自动注入
2015-11-26 13:23
661 查看
在前文的Demo中,webApi的Controller是不能自动注入的,原因是 IHttpController 和 IController 是通过两个不同的途径进行激活的。
IHttpController的激活是通过 IHttpControllerActivator 接口完成的
而其默认实现类为:DefaultHttpControllerActivator
知道了上述信息,最简单的办法就是继承并重写 DefaultHttpControllerActivator ,但是不巧的是其 Create 不是虚函数,不能重写。咋办法呢?变通一下,动态改变对象的行为——装饰模式。当然这里没必要严格按照装饰模式死板的去应用,完全没必要的。只需要按照装饰原理,将 DefaultHttpControllerActivator 进行装饰,再将装饰对象注册到系统中即可。
比如:
然后在 应用程序启动的时候进行注册:
如此,WebApi中的Controller属性,也会被自动注入了。
源码地址:http://files.cnblogs.com/files/08shiyan/AOPDemo.zip
(暂完,后续补充中...)
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
(暂完,后续补充中...)
相关文章推荐
- nsq源码阅读笔记之nsqd(二)——Topic
- linux内核参数优化
- nginx 基础文档
- Shell中的数组
- 使用PhotoShop制作gif动画全过程
- 使用Shell脚本实现NFS挂载自动切换
- linux下修改网卡名称
- Linux更新出错解决方案
- centos中的qt设计师所在的包
- 架构设计思想
- Centos eclipse C++ 环境配置
- 运维入门---If you insist running as root, then set the environment variable RUN_AS_USER=root...
- Linux卸载NAS磁盘,报device is busy
- linux系统安装libpcap
- Linux启动过程详解
- Java解压缩文件(利用apache的ant包)
- linux基础命令学习之touch(2)
- Linux(CentOS) 安装JDK
- centos安装Docker
- Linux 下Nginx的安装