在子容器中类型解析失败,但在父容器中成功

本文关键字:成功 类型 失败 | 更新日期: 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的工厂方法(例如使用子容器)。