WCF服务中的Unity

时间:2015-09-25 15:50:54

标签: c# wcf unity-container

我正在尝试将我的Unity文件合并到由子容器分隔的单个文件中,以简化最终系统配置,但很难弄清楚它。到目前为止,我已经实现了自己的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"]);
    }
}  

如果您有办法,请告诉我。

1 个答案:

答案 0 :(得分:2)

Unity配置是附加的,所以我不确定你在这里需要子容器。根据我在帖子中看到的内容,应该可以“建立”#34;一个容器,具有您需要的所有配置。 [如果这个假设不正确,那将有助于解释为什么以及你遇到的问题。]

当您想要保留原始容器并使用其大部分设置但具有一些配置差异时(例如,单身生命周期不是真正的全局单例,而是作用于子容器),通常会使用子容器。

基于以上所述,我认为您应该能够配置一个容器,每个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(这会覆盖默认容器中的第一个注册)和{{ 1}}名称&#34;眼睛&#34;映射到IDoctor(在第二次EyeDoctor呼叫后保留现有注册)。