zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

对象AOP开发 解决 不能 直接 New 简化
2023-09-14 09:00:58 时间

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

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

ExpandedBlockStart.gif 复制代码 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; 
        } 
    } 
复制代码 ExpandedBlockStart.gif 复制代码 [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(); 
    } 复制代码
Java Spring IOC容器与依赖注入DI实现原理 本文主要讲解Spring IOC机制和实现过程,依赖注入DI和面向切面编程AOP是Spring框架的核心概念,几乎后续使用到Spring Boot框架的地方都有这两个概念的影子。也是Java面试的考察点,我们会结合实际的例子演示说明 。
Java:控制反转(IoC)与依赖注入(DI) 今天,正式介绍一下Java极客技术知识星球 SpringBoot 精髓之 SpringBoot-starter 跟我学spring security系列文章第一章 实现一个基本的登入 Spring 源码分析:不得不重视的 Transaction 事务 我们谈谈面试技巧(初入职场年轻人该学的)
Spring原理学习系列之五:IOC原理之Bean加载 其实很多同学都想通过阅读框架的源码以汲取框架设计思想以及编程营养,Spring框架其实就是个很好的框架源码学习对象。我们都知道Bean是Spring框架的最小操作单元,Spring框架通过对于Bean的统一管理实现其IOC以及AOP等核心的框架功能,那么Spring框架是如何把Bean加载到环境中来进行管理的呢?本文将围绕这个话题进行详细的阐述,并配合Spring框架的源码解析。