前面三篇隨筆,已經(jīng)完成了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); // 當(dāng)然 ServiceException 中的 Code屬性也可以存儲在 ServiceAbstract 對象中 return View(); } }
如上的代碼片段中,myService 并未被賦值,而是被直接使用調(diào)用了Test方法。那么 該屬性是什么時候被賦值的呢?
答案是:MVC框架、Controller激活的時候。
在 MVC框架中,Controller的激活是在 DefaultControllerFactory 中完成的,重寫該類,并將其進行注冊,便可實現(xiàn),在激活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.VEVb.com/files/08shiyan/AOPDemo.zip
(自己實現(xiàn)簡單的AOP 暫完、后續(xù)進行補充)
新聞熱點
疑難解答