Unity Application Block能从XML配置文件读取配置信息。 默认情况下,一般是随同应用程序的
App.config和
Web.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方法在你需要的继承深度中创建容器对象,然后通过读取各自的配置文件加载合适的配置。下面的代码展示了如何从配置文件中实例化和加载两个容器,这个配置文件同时包含了针对两个命名为
containerOne和
newstedChildContainer容器的注册信息,类型映射和扩展定义。
: 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>元素中创建多个容器