代码之家  ›  专栏  ›  技术社区  ›  Gabriel Graitzer

WCF服务中的Unity

  •  0
  • Gabriel Graitzer  · 技术社区  · 10 年前

    为了简化最终系统配置,我正在尝试将我的统一文件合并到由子容器分隔的单个文件中,但很难弄清楚。到目前为止,我已经实现了自己的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 回复  |  直到 10 年前
        1
  •  2
  •   Randy Levy    10 年前

    Unity配置是附加的,所以我不确定您是否需要子容器。根据我在帖子中看到的内容,应该可以用您需要的所有配置“构建”一个容器。[如果这一假设不正确,则有助于解释原因以及您遇到的问题。]

    当您希望保留原始容器并使用其大部分设置,但存在一些配置差异(例如,单例生存期不是真正的全局单例,而是子容器的范围)时,通常会使用子容器。

    基于以上内容,我认为您应该能够为每个容器配置一个容器 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”映射到 眼科医生 (现有注册在秒后保留 LoadConfiguration 呼叫)。