在子容器中类型解析失败,但在父容器中成功
本文关键字:成功 类型 失败 | 更新日期: 2023-09-27 18:18:11
我有两个模块的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。注册方法。这允许您为任何给定的视图类型设置映射,以提供构造适当ViewModel的工厂方法(例如使用子容器)。