[EntLib]微软企业库5.0 学习之路 Unity&PIAB 配置

  之前写过一篇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

posted on 2012-08-25 10:49  上善若水123  阅读(776)  评论(0编辑  收藏  举报