RSS

导航







快速搜索

高级搜索 »

Unity 1.x 中文文档:3.2 - 输入配置信息

修改时间: 2008/05/25 10:21 由 doriandeng - 编目为: Unity
注意:此页面是Unity 1.x 中文文档的一部分。

Unity Application Block能从XML配置文件读取配置信息。 默认情况下,一般是随同应用程序的App.configWeb.config文件。然而,你也能从其他XML格式文件或者其他来源中加载配置信息。 接下来的章节中详细描述了如何配置Unity Application Block:
  • Unity配置文件格式
  • 加载配置信息到容器
  • 使用替换配置源
  • 动态配置构造函数,属性和方法注入
  • Unity配置图解
  • 针对Unity Application Block的源结构

Unity配置文件格式
如下的XML展示了配置文件的大体结构。 如果你想针对application block提供配置信息,必须使用文本编辑器(例如Visual Studio文本编辑)修改该文件。对于Unity Application Block中每个元素(element)和属性(attribute)的具体含义,参见针对Unity Application Block的源结构 和 Unity配置图解
<?xml version="1.0" encoding="utf-8" ?> 
<configuration>

<configSections>
  <section name="unity"
            type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
                 Microsoft.Practices.Unity.Configuration, Version=1.0.0.0,
                 Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>

<unity>

  <typeAliases>

    
    <typeAlias alias="singleton"
         type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
               Microsoft.Practices.Unity" />
    <typeAlias alias="external"
         type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,
               Microsoft.Practices.Unity" />

    
    <typeAlias alias="IMyInterface"
         type="MyApplication.MyTypes.MyInterface, MyApplication.MyTypes" />
    <typeAlias alias="MyRealObject" 
         type="MyApplication.MyTypes.MyRealObject, MyApplication.MyTypes" />
    <typeAlias alias="IMyService"
         type="MyApplication.MyTypes.MyService, MyApplication.MyTypes" />
    <typeAlias alias="MyDataService"
         type="MyApplication.MyTypes.MyDataService, MyApplication.MyTypes" />
    <typeAlias alias="MyCustomLifetime" 
         type="MyApplication.MyLifetimeManager, MyApplication.MyTypes" />

  </typeAliases>

  <containers>

    <container name="containerOne">

      <types>

          
        <type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass" />

          
        <type type="IMyInterface" mapTo="MyRealObject" name="MyMapping" />

        
        <type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass">
          <lifetime type="singleton" /> 
        </type>
        <type type="IMyInterface" mapTo="MyRealObject" name="RealObject">
          <lifetime type="external" />
        </type>

        
        
        
        <type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass">
          <lifetime value="sessionKey"
                    type="MyApplication.MyTypes.MyLifetimeManager,
                          MyApplication.MyTypes" />
        </type>

        
        <type type="IMyInterface" mapTo="MyRealObject" name="CustomSession">
          <lifetime type="MyCustomLifetime" value="ReverseKey"
                    typeConverter="MyApplication.MyTypes.MyTypeConverter,
                                   MyApplication.MyTypes" />
        </type>

        
          
        <type type="IMyService" mapTo="MyDataService" name="DataService">
          <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,
                                     Microsoft.Practices.Unity.Configuration">
            <constructor>
              <param name="connectionString" parameterType="string">
                <value value="AdventureWorks"/>
              </param>
              <param name="logger" parameterType="ILogger">
                <dependency />
              </param>
            </constructor> 
            <property name="Logger" propertyType="ILogger" />
            <method name="Initialize">
              <param name="connectionString" parameterType="string">
                <value value="contoso"/>
              </param>
              <param name="dataService" parameterType="IMyService">
                <dependency />
              </param>
            </method>
          </typeConfig>
        </type>

      </types>

      <instances>
        <add name="MyInstance1" type="System.String" value="Some value" />
        <add name="MyInstance2" type="System.DateTime" value="2008-02-05T17:50:00"  />
      </instances>

      <extensions>
        <add type="MyApp.MyExtensions.SpecialOne" />
      </extensions>

      <extensionConfig>
        <add name="MyExtensionConfigHandler"
             type="MyApp.MyExtensions.SpecialOne.ConfigHandler" />
      </extensionConfig>

    </container>

    

  </containers>

</unity>

</configuration>


加载配置信息到容器中
Unity Application Block不会自动读取配置信息或者创建,进而为开发者准备好需要使用的容器对象。 为了提供最大限度的灵活度, 你需要在你的应用程序中实例化一个Unity容器,通过读取配置文件,赋予其注册信息,类型映射和扩展定义。这种机制允许你通过配置信息创建嵌套容器继承,同时也管理每个容器的生命周期。
如果配置文件仅仅定义了一个单独的未命名容器或规定了默认容器,以下代码会实例化一个新的Unity容器对象,然后通过读取针对该容器的配置文件,为其加载相应的注册信息,类型映射和扩展定义。
: C#
IUnityContainer container = new UnityContainer();
UnityConfigurationSection section
  = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers.Default.Configure(container);

: Visual Basic
Dim container As IUnityContainer = New UnityContainer()
Dim section As UnityConfigurationSection _
  = CType(ConfigurationManager.GetSection("unity"), UnityConfigurationSection)
section.Containers.Default.Configure(container)

为了加载一个特殊命名容器的配置信息,需要使用定义在配置文件中的容器名,而不是引用默认容器。例如,如果在配置中有一个命名为containerOne的容器,能使用如下代码初始化并加载它:
: C#
IUnityContainer container = new UnityContainer();
UnityConfigurationSection section 
  = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers["containerOne"].Configure(container);

: Visual Basic
Dim container As IUnityContainer = New UnityContainer()
Dim section As UnityConfigurationSection _
  = CType(ConfigurationManager.GetSection("unity"), UnityConfigurationSection)
section.Containers("containerOne").Configure(container)

这意味着在需要的时候,你能通过管理引用该容器对象的变量析构(dispose)该容器
为了从配置信息中创建一个嵌套容器继承, 可以简单的使用CreateChildContainer方法在你需要的继承深度中创建容器对象,然后通过读取各自的配置文件加载合适的配置。下面的代码展示了如何从配置文件中实例化和加载两个容器,这个配置文件同时包含了针对两个命名为containerOnenewstedChildContainer容器的注册信息,类型映射和扩展定义。
: C#
IUnityContainer parentContainer = new UnityContainer();
IUnityContainer childContainer = parentContainer.CreateChildContainer();
UnityConfigurationSection section 
  = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers["containerOne"].GetConfigCommand().Configure(parentContainer);
section.Containers["nestedChildContainer"].Configure(childContainer); 

: Visual Basic
Dim parentContainer As IUnityContainer = New UnityContainer()
Dim childContainer As IUnityContainer =  parentContainer.CreateChildContainer()
Dim section As UnityConfigurationSection _
  = CType(ConfigurationManager.GetSection("unity"), UnityConfigurationSection)
section.Containers("containerOne").GetConfigCommand().Configure(parentContainer)
section.Containers("nestedChildContainer").Configure(childContainer) 

: 注意 不能在配置文件中嵌套容器。所有<containers>元素之下的<container>元素在同一个级别层级。只能在代码中创建所需继承深度的容器对象,配置嵌套容器。如果需要的话,可以从同一<container>元素中创建多个容器
.NET 藏经阁 | | 版权所有 ©2008 entlib.net.cn