当前位置: 代码迷 >> .NET相关 >> 自各儿实现简单的AOP(四)自动初始化代理对象
  详细解决方案

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

热度:125   发布时间:2016-04-24 02:42:08.0
自己实现简单的AOP(四)自动初始化代理对象

 

前面三篇随笔,已经完成了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 暂完、后续进行补充)

 

  相关解决方案