Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在子容器中解析类型失败,但在父容器中成功_C#_Unity Container_Prism_Ioc Container - Fatal编程技术网

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

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

我有两个模块的Prism应用程序,其中一个(第二个模块)依赖于另一个(第一个模块)。我也在使用log4net,我希望每个模块都有单独的记录器。因此,我尝试使用子容器。第二个模块就是这样做的

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方法。这使您可以为任何给定视图类型设置映射,以提供构造适当视图模型的工厂方法(例如使用子容器)