首页 > 学院 > 开发设计 > 正文

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

2019-11-14 15:45:36
字体:
来源:转载
供稿:网友

 

前面三篇随笔,已经完成了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.VEVb.com/files/08shiyan/AOPDemo.zip

 

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

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表