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

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 的工厂方法(例如使用您的子容器)。