zoukankan      html  css  js  c++  java
  • 自己实现简单的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 暂完、后续进行补充)

  • 相关阅读:
    webDriver检索table数据
    C# 遍历枚举
    Java——Iterate through a HashMap
    Java——Read/convert an InputStream to a String
    简单的异步HTTP服务端和客户端
    授信主体查找
    mysql 事务测试
    mysql 替换
    如何查看由EF生成的SQL?
    C# 如何用多字符分割字符串
  • 原文地址:https://www.cnblogs.com/08shiyan/p/4905175.html
Copyright © 2011-2022 走看看