AOP之PostSharp7-解决IOC 不能直接new问题,简化IOC开发和IOC对象LazyLoad

    经过几节的postsharp基础和每节的一个应用实例,已经基本PostSharp应用的能力,PostSharp主要是简化我们的开发,让编译器时候给我注入重复疲劳代码。  

   在今天我们的demo是,关于ioc(控制反转)的问题,ioc框架我们都会从ioc容器中取得我们的ioc对象注入,所以我们不能直接new对象得到我们的实例,必须Resolve。我一直都是很懒得人,既然有了PostSharp就的好好利用起来。大部份ioc逻辑是从以前的一篇利用Attribute简化Unity框架IOC注入转过来的,注入支持自定义配置文件,我个人不喜欢把配置信息全部写在一个web.config/app.config中,也不喜欢el的写在一个外部配置文件中,我个人倾向于每个模块在一个不能的配置文件,并在模块中在区分container容易,所以特别写了每个单独配置文件的延时加载,缓存。代码也不多,先上菜品:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Practices.Unity; 
using Microsoft.Practices.Unity.Configuration; 
using Microsoft.Practices.Unity.InterceptionExtension; 

namespace PostSharpDemo 

    [Serializable] 
    public class IocUnityResolverAttribute : PostSharp.Aspects.LocationInterceptionAspect 
    { 
        private Dictionary<string, Microsoft.Practices.Unity.Configuration.UnityConfigurationSection> sectionCache = new Dictionary<string, Microsoft.Practices.Unity.Configuration.UnityConfigurationSection>(); 
        private static object lockObj = new object(); 
        public IocUnityResolverAttribute(string Container) 
        { 
            this.Container = Container; 
        } 

        public string Container 
        { 
            get; 
            set; 
        } 

        public string ConfigFile 
        { 
            get; 
            set; 
        } 

        public string Name 
        { 
            get; 
            set; 
        } 

        public Microsoft.Practices.Unity.Configuration.UnityConfigurationSection GetUnityConfigurationSection() 
        { 
            if (!string.IsNullOrEmpty(this.ConfigFile)) 
            { 
                Microsoft.Practices.Unity.Configuration.UnityConfigurationSection section = null; 
                if (!sectionCache.ContainsKey(this.ConfigFile)) 
                { 
                    lock (lockObj) 
                    { 
                        if (!sectionCache.ContainsKey(this.ConfigFile)) 
                        { 
                            var fileMap = new System.Configuration.ExeConfigurationFileMap { ExeConfigFilename = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, this.ConfigFile) }; 
                            System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None); 
                            if (configuration == null) 
                            { 
                                throw new Exception(string.Format("Unity配置{0}不正确;", this.ConfigFile)); 
                            } 
                            section = configuration.GetSection(Microsoft.Practices.Unity.Configuration.UnityConfigurationSection.SectionName) as Microsoft.Practices.Unity.Configuration.UnityConfigurationSection; 
                            sectionCache.Add(this.ConfigFile, section); 
                        } 
                    } 
                } 
                return sectionCache[this.ConfigFile]; 
            } 

            return System.Configuration.ConfigurationManager.GetSection(Microsoft.Practices.Unity.Configuration.UnityConfigurationSection.SectionName) as Microsoft.Practices.Unity.Configuration.UnityConfigurationSection; 
        } 

        public override void OnGetValue(PostSharp.Aspects.LocationInterceptionArgs args) 
        { 
            var current = args.GetCurrentValue(); 
            if (current == null) 
            { 
                var unitySection = this.GetUnityConfigurationSection(); 
                if (unitySection != null) 
                { 
                    var container = new Microsoft.Practices.Unity.UnityContainer().LoadConfiguration(unitySection, string.IsNullOrEmpty(Container) ? unitySection.Containers.Default.Name : Container); 
                    var obj = string.IsNullOrEmpty(Name) ? container.Resolve(args.Location.LocationType) : container.Resolve(args.Location.LocationType, Name); 
                    if (obj != null) 
                    { 
                        //var piabAtttr = obj.GetType().GetCustomAttributes(typeof(ELPolicyinjectionAttribute), false) as ELPolicyinjectionAttribute[]; 
                        //if (piabAtttr.Length > 0) 
                        //{ 
                        //    obj = Microsoft.Practices.EnterpriseLibrary.PolicyInjection.PolicyInjection.Wrap(type, obj); 
                        //} 
                        args.Value = obj; 
                        args.ProceedSetValue(); 
                    } 
                } 
            } 
            args.ProceedGetValue(); 
        } 

        public override bool CompileTimeValidate(PostSharp.Reflection.LocationInfo locationInfo) 
        { 
            var p = locationInfo.PropertyInfo;           
            if (p != null) 
            {               
                var attrs = p.GetCustomAttributes(typeof(Microsoft.Practices.Unity.DependencyAttribute), true) as Microsoft.Practices.Unity.DependencyAttribute[]; 
                if (attrs != null && attrs.Length > 0) 
                { 
                    return true; 
                } 
            } 
            return false; 
        } 
    } 
}

测试:

[IocUnityResolver("IocUnityResolver", ConfigFile = "App1.config")] 
   class Program 
   { 
       [Microsoft.Practices.Unity.Dependency()]        
       public static IIocUnityResolverAttributeTest IocUnityResolverAttributeTest 
       { 
           get; 
           private set; 

       } 
       public static IIocUnityResolverAttributeTest IocUnityResolverAttributeTest2 
       { 
           get; 
           private set; 

       } 

       static void Main(string[] args) 
       { 

Program.IocUnityResolverAttributeTest.Test("test ioc unity!"); 

        Console.Read(); 
    }

效果:

另外多加一句在AOP之PostSharp初见-OnExceptionAspect这节我们系列开篇我们看了Postsharp的多播(),所以我们可以很轻松的应用于我们的程序集,类上加Attribute实现,但是这里必须要区分Location的的注入决策,所以这里重写的基类方法的CompileTimeValidate,在有EL Unity 中Microsoft.Practices.Unity.DependencyAttribute标签的location我们才会去植入。有了这些我们就很轻松的在各个类,程序集,命名空间引用。

看看我们上边的实例反编译效果,IocUnityResolverAttributeTest带有Microsoft.Practices.Unity.DependencyAttribute标签所以会植入,而IocUnityResolverAttributeTest2没有标签所以不会植入;

 

附件下载:demo

AOP之PostSharp初见-OnExceptionAspect
AOP之PostSharp2-OnMethodBoundaryAspect
AOP之PostSharp3-MethodInterceptionAspect
AOP之PostSharp4-实现类INotifyPropertyChanged植入
AOP之PostSharp5-LocationInterceptionAspect
AOP之PostSharp6-EventInterceptionAspect
AOP之PostSharp7-解决IOC 不能直接new问题,简化IOC开发和IOC对象LazyLoad
http://www.cnblogs.com/whitewolf/category/312638.html

 

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2011/12/18/PostSharp7.html

时间: 2024-08-29 11:03:55

AOP之PostSharp7-解决IOC 不能直接new问题,简化IOC开发和IOC对象LazyLoad的相关文章

cad-求各位大神解决:基于VBA的CAD二次开发的一个编程小习题

问题描述 求各位大神解决:基于VBA的CAD二次开发的一个编程小习题

解决网游营销低俗化关键是开发原创作品

近日,文化部开始"扫黄",6日印发关于加强网络游戏市场推广管理.制止低俗营销行为的函,禁止不雅照女主角代言网游. 这样一来,兽兽等人就要失去这个市场了,而网游商家们也迅速变脸,纷纷站出来撇得一干二净:"走了几场秀而已,不是代言人". 但是,仅凭一纸禁令真的就能净化网游这块土壤吗?虽然它对网游行业的营销行为能够起到正面的引导,但是要从根本上为网游环境正本清源,谈何容易.接下来网游之路又该如何走呢? 路海燕,中国美院传媒动画学院网络游戏系主任,她感慨道:"不单

AOP C#在行动

看过一本书,题目是<AscpectJ in Action>,正好这一段手上的项目搞一段落,所以有一点点空暇,决定写一些东西. AOP是Aspect-Oriented Programming的简写.曾经为这个Aspect的中文翻译伤透了脑筋,还有一个相似的AOP,那是Attribute-Oriented Programming,于是,有人译作面向方面编程,后者则是面向特性编程.面向特性编程可以说得过去,总觉得面向方面编程翻译的有些怪,一则中文理解不通:什么叫面向方面?或者按台湾的习惯"

IoC容器与面向方面编程在SP无线运营系统设计中的应用

一直以来,在SP无线运营系统的中关于同步接口的设计由于上下家系统设计的规范不一致,导致这一 部分不能很好的抽象共用,在我近2年来接触的各方平台接口大部分都是以一个接口作为一个页面的形式 开放给上下家使用,表现形式只是编程平台的不同,或asp或php等,同一系统各接口的共用部分也多以数 据访问层为主. 接下来将就我如何应用IoC控制反转容器和AOP来从技术角度解决这一问题做一个描述. 做无线运营的朋友众所周知,关于用户上下行(以短信,彩信,WAP等方式)直到扣费,涉及到的相关 步骤有 预提交,MO

Spring AOP从入门到放弃之概念以及Spring Boot AOP demo

本文小福利 点我获取阿里云优惠券 AOP核心概念 1.横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点 2.切面(aspect)->(通知+切点) 类是对物体特征的抽象,切面就是对横切关注点的抽象. 通知+切点 意思就是所有要被应用到增强(advice)代码的地方.(包括方法的方位信息) 3.连接点(joinpoint)->(被拦截的方法) 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截的方法,实际上连接点还可以是字段或

依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)

依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦.所谓横切关注点,即影响应用多处的功能,这些功能各个应用模块都需要,但又不是其主要关注点,常见的横切关注点有日志.事务和安全等. 将横切关注点抽离形成独立的类,即形成了切面.切面主要由切点和通知构成,通知定义了切面是什么,以及何时执行何种操作:切点定义了在何处执行通知定义的操作. http://ju.outofmemory.cn/entry/216839 引子: AOP(面向方面编程:Asp

Spring的IoC容器实现原理(一)#loadBeanDefinition

Spring有十几个组件,核心组件为bean(演员)-context(舞台)-core(道具) bean包装的是object,而object中肯定要有数据,如何给这些数据提供生存环境就是context要解决的问题,对于context来说他就是要发现每个bean之间的关系,为他们建立起来并维护好这些关系.所以context就是一个bean关系的集合,这个关系集合就是我们常说的IOC容器.core组件就是发现.建立和维护每个bean之间的关系所需要的一些工具,把core叫做util更为贴切.   

傻嘎,IOC原来是这样子的

昨天有网友Call我留言,说他写了个DI架构,让我有时间看看,于是我就上去看了: 文章地址: http://www.cnblogs.com/lenic/archive/2013/06/04/3117893.html 发现是E文的,于是回复: 路过秋天 22:32:43  怎么还写E文的 NOoK 22:33:03  直接在 CodePlex 上写的介绍 NOoK 22:33:08  然后就粘过来了 NOoK 22:33:15  结果还被博客园下架了... NOoK 22:34:40  悲催的 路

SSH框架的常见问题和解决方法_java

Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.他很大程度的简化DAO层的编码工作