类型解析在子容器中失败但在父容器中成功
Resolution of type failed in child container but succeeded in parent container
我的 Prism 应用程序有两个模块,其中一个 (SecondModule) 依赖于另一个 (FirstModule)。我也在使用 log4net,我希望每个模块都有单独的记录器。因此我尝试使用子容器。 SecondModule 是这样做的
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
}
}
PatientSearch
是一个用户控件,配置为自动连接视图模型作为其数据源,并且此视图模型具有构造函数参数 IPatientSearchService
。现在的问题是,当 Prism 尝试在视图模型自动装配期间解析 IPatientSearchService
时,它失败并出现异常
The current type, PatientSearchModule.Services.IPatientSearchService, is an interface and cannot be constructed. Are you missing a type mapping?
问题是,如果我在模块构造函数中用 this.container = container
替换 this.container = container.CreateChildContainer();
,一切正常。这种情况下子容器有什么问题?
编辑: 经过一些调查,我想我知道原因了。问题是 ViewModelLocator 使用默认容器(在我的例子中是父容器)来解析视图模型。所以新问题是:如何重新配置它以使用适当的容器?
使用ViewModelLocationProvider.Register方法。这使您可以为任何给定的视图类型设置映射,以提供构造适当 ViewModel 的工厂方法(例如使用您的子容器)。
我的 Prism 应用程序有两个模块,其中一个 (SecondModule) 依赖于另一个 (FirstModule)。我也在使用 log4net,我希望每个模块都有单独的记录器。因此我尝试使用子容器。 SecondModule 是这样做的
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
}
}
PatientSearch
是一个用户控件,配置为自动连接视图模型作为其数据源,并且此视图模型具有构造函数参数 IPatientSearchService
。现在的问题是,当 Prism 尝试在视图模型自动装配期间解析 IPatientSearchService
时,它失败并出现异常
The current type, PatientSearchModule.Services.IPatientSearchService, is an interface and cannot be constructed. Are you missing a type mapping?
问题是,如果我在模块构造函数中用 this.container = container
替换 this.container = container.CreateChildContainer();
,一切正常。这种情况下子容器有什么问题?
编辑: 经过一些调查,我想我知道原因了。问题是 ViewModelLocator 使用默认容器(在我的例子中是父容器)来解析视图模型。所以新问题是:如何重新配置它以使用适当的容器?
使用ViewModelLocationProvider.Register方法。这使您可以为任何给定的视图类型设置映射,以提供构造适当 ViewModel 的工厂方法(例如使用您的子容器)。