之前写过一篇Unity和PIAB的文章,但是那是将Unity和PIAB的配置信息写在同一个文件中,如果在真正项目中,这样会很造成配置信息的混乱。今天就看看怎么分开配置文件。
Unity 配置文件。
<?xml version="1.0"?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> </configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="..."/>
<namespace name="..."/>
<namespace name="..."/>
<!--新增配置节扩展,用于下面的<interception>配置节--> <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" /> <container name="AutohomeDal"> <!--为容器增加Interception扩展,如不增加下面interception配置会报错--> <extension type="Interception"/> <container name="AutohomeService"> <register type="IAutoModelCompareCreator" mapTo="AutoModelCompareCreator"> <interceptor isDefaultForType="true" type="InterfaceInterceptor"/> <interceptionBehavior type="PolicyInjectionBehavior"/> </register> <container>
AOP配置文件。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="policyInjection" type="Microsoft.Practices.EnterpriseLibrary.PolicyInjection.Configuration.PolicyInjectionSettings, Microsoft.Practices.EnterpriseLibrary.PolicyInjection, Version=5.0.414.0, Culture=neutral, PublicKeyToken=null" requirePermission="true" /> </configSections> <policyInjection> <policies> <add name="myPolicy"> <matchingRules> <add type="Microsoft.Practices.EnterpriseLibrary.PolicyInjection.MatchingRules.MemberNameMatchingRule, Microsoft.Practices.EnterpriseLibrary.PolicyInjection, Version=5.0.414.0, Culture=neutral, PublicKeyToken=null" name="Member Name Matching Rule"> <matches> <add match="Create*" /> </matches> </add> </matchingRules> <handlers> <add type="Autohome.CMS.FragmentCreator.Aop.FragmentCallHandler,Autohome.CMS.FragmentCreator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="FragmentCallHandler" /> </handlers> </add> </policies> </policyInjection> </configuration>
其实最关键的是,将这两个配置文件信息注入的IUnityContainer 对象中。
private IUnityContainer GetUnityContainer() { ////根据文件名获取指定config文件 string filePath = AppDomain.CurrentDomain.BaseDirectory + @"App_Data/Configs/Unity.config"; var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = filePath }; //从config文件中读取配置信息 Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); var unitySection = (UnityConfigurationSection)configuration.GetSection("unity"); var container = new UnityContainer(); foreach (var item in unitySection.Containers) { container.LoadConfiguration(unitySection, item.Name); } //上面是上篇讲的DI依赖注入XML文件的读取,下面是本篇讲的AOP的XML文件读取 string filePath1 =AppDomain.CurrentDomain.BaseDirectory + @"App_Data/Configs/Aop.config"; var fileSource = new FileConfigurationSource(filePath1); var configurationSection = (PolicyInjectionSettings)fileSource.GetSection("policyInjection"); if (configurationSection != null) { configurationSection.ConfigureContainer(container, fileSource); } return container; }
本文只是为了说明将IOC和AOP的配置分开,如何加载配置。至于他们结合的其他细节请参考
http://www.cnblogs.com/dyfzwj/archive/2011/11/21/2257279.html