在前文的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

(暂完,后续补充中...)

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

  1. 自己实现简单的AOP(四)自动初始化代理对象

    前面三篇随笔,已经完成了AOP的核心功能,但 代理对象的初始化还是有些麻烦,本文将解决该问题. Demo 片段如下: public class HomeController : Controller ...

  2. 一个简单的MariaDB认证插件demo

    代码地址如下:http://www.demodashi.com/demo/13076.html 一.前言 众所周知(其实可能很多人不知道)MariaDB支持插件认证.在MariaDB中新建用户,常见的 ...

  3. 自己实现简单的AOP(二)引入Attribute 为方法指定增强对象

    话续前文 : 自己实现简单的AOP(一)简介 在前一篇文章中,对AOP的实现方式做了一个简单介绍.接下来,引入Attribute 为方法指定增强对象,由此实现一个简单的AOP. 注意:指定的是增强对象 ...

  4. socket.io简单说明及在线抽奖demo

    socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...

  5. 如何使用AEditor制作一个简单的H5交互页demo

    转载自:http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao/ 本教程演示如何使用AEditor制作一个 ...

  6. 从头认识Spring-3.8 简单的AOP日志实现(注解版)-扩展添加检查订单功能,以便记录并检測输入的參数

    这一章节我们讨论一下扩展添加检查订单功能,以便记录并检測输入的參数. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03 ...

  7. aop学习总结二------使用cglib动态代理简单实现aop功能

    aop学习总结二------使用cglib动态代理简单实现aop功能 模拟业务需求: 1.拦截所有业务方法 2.判断用户是否有权限,有权限就允许用户执行业务方法,无权限不允许用户执行业务方法 (判断是 ...

  8. 从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志

    这一章节我们引入简单的AOP日志实现. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03.topic_1_1; pub ...

  9. 从头认识Spring-3.4 简单的AOP日志实现-扩展添加检查订单功能,以便记录并检測输入的參数

    这一章节我们再上一个章节的基础上加上一个检查订单功能 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03.topic_1 ...

随机推荐

  1. wpf之mvvm基类

    当我们用MVVM设计模式的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了.代码如下:   1 2 3 4 5 6 7 8 9 10 1 ...

  2. 元素的click与dblclick

    JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,是用户或浏览器自身执行的某种动作.诸如click.load.mousemover,都是事 ...

  3. iOS7的启动画面设置及asset catalogs简介

    如果上网搜索一下“iOS App图标设置”或者“iOS App启动画面设置”肯定能找到不少文章,但内容大多雷同,就是让你按照某种尺寸制作若干张png图片,再按照苹果的命名规范,加入到项目中去,一行代码 ...

  4. CVTE实习求职经历

    今天,听到有好多同学最近要去面试CVTE这家企业,于是呢,准备将自己的经历写上来,给大家一个参考,希望能够大家一次帮助. 一.整体感觉 首先呢,先讲一下我个人对这家企业的整体感觉吧. 1. 第一次 对 ...

  5. .NET 的 Debug 和 Release build 对执行速度的影响

    这篇文章发布于我的 github 博客:原文 在真正开始讨论之前先定义一下 Scope. 本文讨论的范围限于执行速度,内存占用什么的不在评估的范围之内. 本文不讨论算法:编译器带来的优化基本上属于底层 ...

  6. 老司机学新平台 - Xamarin开发环境及开发框架初探

    随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增.免费.更好的VS2015集成.更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即 ...

  7. JVM系列-分代收集垃圾回收

    Java自动垃圾回收(Automatic Garbage Collection)是自动回收堆上不再使用的内存,new的对象在程序中没有引用指向它,就会被回收.回收的实现很多,有Reference Co ...

  8. <canvas>drawImage()方法无法显示图片

    在书上看到用<canvas>绘制图像就动手试试,刚开始,我的代码是这样的: <!DOCTYPE html> <html> <head> <meta ...

  9. Spring4.X——搭建

    一,Spring概念总结 spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程),所以spring既是一个IOC容器,也是一个AOP框架. ...

  10. PMO是什么?如何与其他部门协作配合提高项目成功率?

    许多公司里,有许多IT项目,特别是在软件公司里,许多开发团队并没有运用灵敏开发来进行项目办理.在某些状况下,尤其在一些公司里IT不是很受注重的,只能作为一个事务支撑部分,灵敏团队面对的首要疑问,是缺少 ...