前面三篇随笔,已经完成了AOP的核心功能,但 代理对象的初始化还是有些麻烦,本文将解决该问题。
Demo 片段如下:
public class HomeController : Controller
{
/// <summary>
/// 使用 Autowired Attribute 自动初始化代理对象
/// </summary>
[Autowired]
public Service myService { get; set; } public ActionResult Index()
{
myService.Test(); var msg = myService.ErrorMsg;
Console.WriteLine(msg); // 当然 ServiceException 中的 Code属性也可以存储在 ServiceAbstract 对象中 return View();
}
}
如上的代码片段中,myService 并未被赋值,而是被直接使用调用了Test方法。那么 该属性是什么时候被赋值的呢?
答案是:MVC框架、Controller激活的时候。
在 MVC框架中,Controller的激活是在 DefaultControllerFactory 中完成的,重写该类,并将其进行注册,便可实现,在激活Controller的同时也将自动初始化代理对象。
以下是、Global.asax 代码:
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// 注册新的Controller工厂
ControllerBuilder.Current.SetControllerFactory(new MyBatisControllerFactory()); AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
} private class MyBatisControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext requestContext, string controllerName)
{
IController controller = base.CreateController(requestContext, controllerName); /// 自动装配属性
/// <para>为属性对象启用代理,并延迟初始化被代理的对象</para>
DelayProxyUtil.AutowiredProperties(controller); return controller;
}
}
}
附源码:http://files.cnblogs.com/files/08shiyan/AOPDemo.zip
(自己实现简单的AOP 暂完、后续进行补充)