Prism中的模块依赖性不起作用

时间:2020-01-02 16:17:24

标签: c# wpf prism

我有两个模块:一个模块注册一些服务并在其上使用它们。 但是,第二个模块首先加载,然后引发有关无法解析服务的异常。

为了测试,我将服务注册移至App.xaml.cs中,并使用断点发现第一个模块在第二个模块之后加载。 我可以将其用作替代品,但发现它很脏。

经过一些搜索,我尝试通过在目录配置和模块声明中使用模块依赖性来修复它:

目录配置:

protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) {
            base.ConfigureModuleCatalog(moduleCatalog);
            moduleCatalog.AddModule<Infrastructure.InfrastructureModule>(ModuleNames.InfrastructureName, InitializationMode.WhenAvailable)
            .AddModule<MainStepper.MainStepperModule>(ModuleNames.MainStepper, InitializationMode.WhenAvailable, ModuleNames.InfrastructureName);
        }

模块声明:

    [Module(ModuleName = "Infrastructure")]
    public class InfrastructureModule : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterSingleton<IPrinterService, PrinterService>();
            containerRegistry.RegisterSingleton<IUSBStickService, USBStickService>();
            containerRegistry.RegisterSingleton<IEqpCardRepo, EqpCardRepo>();
        }
    }
    [Module(ModuleName = "MainStepper")]
    [ModuleDependency("Infrastructure")]
    public class MainStepperModule : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }
    }

然而,即使进行了这些更改,第二个模块仍在第一个模块之后加载。

那为什么不起作用?

我正在使用DryIoc和.Net 4.6.1

编辑

我尝试了@ Noisy88解决方案,但是它也不起作用:

    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) {
        base.ConfigureModuleCatalog(moduleCatalog);

        Type MainStepperModuleType = typeof(MainStepper.MainStepperModule);
        Type InfrastructureModuleType = typeof(Infrastructure.InfrastructureModule);

        moduleCatalog.AddModule<Infrastructure.InfrastructureModule>();
        moduleCatalog.AddModule(new ModuleInfo {
            ModuleName = ModuleNames.MainStepper,
            ModuleType = MainStepperModuleType.AssemblyQualifiedName,
            DependsOn = { InfrastructureModuleType.Name }
        });
    }

我想知道是否是因为加载到主要内容区域中的第一个视图在MainStepperModule中。

1 个答案:

答案 0 :(得分:0)

添加模块之前,应在ModuleInfo类实例中设置DependsOn属性。 DependsOn需要模块名称的集合。

protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
   base.ConfigureModuleCatalog(moduleCatalog);


   var moduleA = typeof(ModuleAModule);
   var moduleB = typeof(ModuleBModule);
   var moduleC = typeof(ModuleCModule);
   var moduleInfoB = new ModuleInfo
   {
       DependsOn = new System.Collections.ObjectModel.Collection<string> { moduleA.Name, moduleC.Name },
       ModuleName = moduleB.Name,
       ModuleType = moduleB.AssemblyQualifiedName

    };

    moduleCatalog.AddModule(moduleInfoB);     
    moduleCatalog.AddModule<ModuleAModule>();
    moduleCatalog.AddModule<ModuleCModule>();
}

Here是wpf的示例。