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 调用后保留)。