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

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

前面三篇随笔,已经完成了AOP的核心功能,但 代理对象的初始化还是有些麻烦,本文将解决该问题。

Demo 片段如下:

publicclassHomeController : Controller

{///<summary>///使用 Autowired Attribute 自动初始化代理对象///</summary>[Autowired]publicService myService {get;set; }publicActionResult Index()

{

myService.Test();varmsg =myService.ErrorMsg;

Console.WriteLine(msg);//当然 ServiceException 中的 Code属性也可以存储在 ServiceAbstract 对象中returnView();

}

}

如上的代码片段中,myService 并未被赋值,而是被直接使用调用了Test方法。那么 该属性是什么时候被赋值的呢?

答案是:MVC框架、Controller激活的时候。

在 MVC框架中,Controller的激活是在 DefaultControllerFactory 中完成的,重写该类,并将其进行注册,便可实现,在激活Controller的同时也将自动初始化代理对象。

以下是、Global.asax 代码:

//Note: For instructions on enabling IIS6 or IIS7 classic mode,//visithttp://go.microsoft.com/?LinkId=9394801publicclassMvcapplication: System.Web.HttpApplication

{PRotectedvoidApplication_Start()

{//注册新的Controller工厂ControllerBuilder.Current.SetControllerFactory(newMyBatisControllerFactory());

AreaRegistration.RegisterAllAreas();

WebApiConfig.Register(GlobalConfiguration.Configuration);

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

RouteConfig.RegisterRoutes(RouteTable.Routes);

}privateclassMyBatisControllerFactory : DefaultControllerFactory

{publicoverrideIController CreateController(RequestContext requestContext,stringcontrollerName)

{

IController controller=base.CreateController(requestContext, controllerName);///自动装配属性///<para>为属性对象启用代理,并延迟初始化被代理的对象</para>DelayProxyUtil.AutowiredProperties(controller);returncontroller;

}

}

}

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

(自己实现简单的AOP 暂完、后续进行补充)

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航