C# 在子容器中解析类型失败,但在父容器中成功
我有两个模块的Prism应用程序,其中一个(第二个模块)依赖于另一个(第一个模块)。我也在使用log4net,我希望每个模块都有单独的记录器。因此,我尝试使用子容器。第二个模块就是这样做的C# 在子容器中解析类型失败,但在父容器中成功,c#,unity-container,prism,ioc-container,C#,Unity Container,Prism,Ioc Container,我有两个模块的Prism应用程序,其中一个(第二个模块)依赖于另一个(第一个模块)。我也在使用log4net,我希望每个模块都有单独的记录器。因此,我尝试使用子容器。第二个模块就是这样做的 public class Module : IModule { private readonly IUnityContainer container; private readonly IRegionManager regionManager; public Module(IUni
public class Module : IModule
{
private readonly IUnityContainer container;
private readonly IRegionManager regionManager;
public Module(IUnityContainer container, IRegionManager regionManager)
{
this.regionManager = regionManager;
this.container = container.CreateChildContainer();
}
public void Initialize()
{
RegisterServices();
RegisterViews();
}
private void RegisterServices()
{
container.RegisterInstance(LogManager.GetLogger("PATSEARCH"));
//register all other services
container.RegisterType<IPatientSearchService, PatientSearchService>(new ContainerControlledLifetimeManager());
}
private void RegisterViews()
{
regionManager.RegisterViewWithRegion(RegionNames.MainMenu, () => container.Resolve<PatientSearch>());
//register other views
}
}
公共类模块:IModule
{
专用只读IUnityContainer容器;
专用只读IRegionManager regionManager;
公共模块(IUnityContainer容器、IRegionManager区域管理器)
{
this.regionManager=regionManager;
this.container=container.CreateChildContainer();
}
公共无效初始化()
{
RegisterServices();
RegisterViews();
}
私有无效注册表服务()
{
container.RegisterInstance(LogManager.GetLogger(“PATSEARCH”);
//注册所有其他服务
RegisterType(新的ContainerControlledLifetimeManager());
}
私有void RegisterViews()
{
regionManager.RegisterViewWithRegion(RegionNames.main菜单,()=>container.Resolve());
//登记其他意见
}
}
PatientSearch
是一个用户控件,配置为自动将wire view模型作为其数据源,并且此viewmodel具有构造函数参数iPartientSearchService
。现在的问题是,当Prism在视图模型自动布线期间尝试解析iPartientSearchService
时,它会异常失败
当前类型PatientSearchModule.Services.IPatientSearchService是一个接口,无法构造。是否缺少类型映射?
问题是如果我替换this.container=container.CreateChildContainer()代码>使用this.container=container
内部模块构造函数,一切正常。在这种情况下,子容器有什么问题
编辑:经过调查,我想我知道原因了。问题是ViewModelLocator使用默认容器(在我的例子中是父容器)来解析视图模型。所以新的问题是:如何重新配置它以使用适当的容器?使用ViewModelLocationProvider.Register方法。这使您可以为任何给定视图类型设置映射,以提供构造适当视图模型的工厂方法(例如使用子容器)