我正在尝试将我的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"]);
}
}
如果您有办法,请告诉我。
答案 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
呼叫后保留现有注册)。