WCF 服务中的统一性
Unity in a WCF service
我试图将我的统一文件合并到一个由子容器分隔的文件中,以简化终端系统配置,但我很难弄清楚。到目前为止,我已经实现了自己的 WcfServiceFactory 并覆盖了 ConfigureContainer 以加载我们的 Unity,但无法找到加载子容器的方法。这是我目前所拥有的:
public class WcfServiceFactory : UnityServiceHostFactory
{
/// <summary>
/// Configures the container.
/// </summary>
/// <param name="container">The container.</param>
protected override void ConfigureContainer(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
container.LoadConfiguration();
container.AddExtension(new ConfigExtension());
var childContainer = container.CreateChildContainer();
childContainer.LoadConfiguration(ConfigurationManager.AppSettings["ChildUnityContainer"]);
}
}
如果你有办法做到这一点,请告诉我。
Unity 配置是附加的,所以我不确定您是否需要这里的子容器。根据我在帖子中看到的内容,应该可以 "build up" 一个包含您需要的所有配置的容器。 [如果这个假设不正确,这将有助于解释原因和您遇到的问题。]
当您想保留原始容器并使用它的大部分设置但有一些配置差异时,通常会使用子容器(例如,单例生命周期不是真正的全局单例,而是限定在子容器内)。
基于以上我认为你应该能够配置一个容器,每个ConfigureContainer()
覆盖之前配置中的特定配置:
protected override void ConfigureContainer(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
// Load default container
container.LoadConfiguration();
container.AddExtension(new ConfigExtension());
// Load child configuration on top of first configuration
container.LoadConfiguration(ConfigurationManager.AppSettings["ChildUnityContainer"]);
}
在此之后运行默认配置,应该加载子容器。例如,如果配置如下所示:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<register type="IDoctor" mapTo="Doctor" />
<register type="IDoctor" mapTo="EyeDoctor" name="eye"/>
</container>
<container name="Child">
<register type="IDoctor" mapTo="EyeDoctor"/>
</container>
</unity>
在调用 LoadConfiguration()
和 LoadConfiguration("Child")
之后,容器将有 2 个注册:IDoctor
映射到 EyeDoctor
(这会覆盖默认容器中的第一个注册)和IDoctor
名称 "eye" 映射到 EyeDoctor
(现有注册在第二次 LoadConfiguration
调用后保留)。
我试图将我的统一文件合并到一个由子容器分隔的文件中,以简化终端系统配置,但我很难弄清楚。到目前为止,我已经实现了自己的 WcfServiceFactory 并覆盖了 ConfigureContainer 以加载我们的 Unity,但无法找到加载子容器的方法。这是我目前所拥有的:
public class WcfServiceFactory : UnityServiceHostFactory
{
/// <summary>
/// Configures the container.
/// </summary>
/// <param name="container">The container.</param>
protected override void ConfigureContainer(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
container.LoadConfiguration();
container.AddExtension(new ConfigExtension());
var childContainer = container.CreateChildContainer();
childContainer.LoadConfiguration(ConfigurationManager.AppSettings["ChildUnityContainer"]);
}
}
如果你有办法做到这一点,请告诉我。
Unity 配置是附加的,所以我不确定您是否需要这里的子容器。根据我在帖子中看到的内容,应该可以 "build up" 一个包含您需要的所有配置的容器。 [如果这个假设不正确,这将有助于解释原因和您遇到的问题。]
当您想保留原始容器并使用它的大部分设置但有一些配置差异时,通常会使用子容器(例如,单例生命周期不是真正的全局单例,而是限定在子容器内)。
基于以上我认为你应该能够配置一个容器,每个ConfigureContainer()
覆盖之前配置中的特定配置:
protected override void ConfigureContainer(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
// Load default container
container.LoadConfiguration();
container.AddExtension(new ConfigExtension());
// Load child configuration on top of first configuration
container.LoadConfiguration(ConfigurationManager.AppSettings["ChildUnityContainer"]);
}
在此之后运行默认配置,应该加载子容器。例如,如果配置如下所示:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<register type="IDoctor" mapTo="Doctor" />
<register type="IDoctor" mapTo="EyeDoctor" name="eye"/>
</container>
<container name="Child">
<register type="IDoctor" mapTo="EyeDoctor"/>
</container>
</unity>
在调用 LoadConfiguration()
和 LoadConfiguration("Child")
之后,容器将有 2 个注册:IDoctor
映射到 EyeDoctor
(这会覆盖默认容器中的第一个注册)和IDoctor
名称 "eye" 映射到 EyeDoctor
(现有注册在第二次 LoadConfiguration
调用后保留)。