【问题标题】:Modules dependency in Prism are not workingPrism 中的模块依赖不起作用
【发布时间】:2020-01-02 16:17:24
【问题描述】:

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

为了测试,我在 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

【问题讨论】:

  • 评论多于答案,但关于the second module load first and then throws exception about being unable to resolve the service - 通常,RegisterTypes 应该这样做,注册类型,而不是解析它们,从而完全避免了这种错误。
  • 问题是我注册了它们(使用 registerSingleton)并且在另一个模块中我尝试将它们与依赖注入一起使用。但是,由于注册码尚未执行,容器无法解析它们

标签: c# wpf prism


【解决方案1】:

您应该在添加模块之前在 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 的一个示例。

【讨论】:

  • 我尝试了您的解决方案,但没有成功。我仍然得到同样的错误。我更新了我的问题以包含这个
  • 尝试运行github代码。我在企业应用程序中使用了这个技巧。它工作正常。
  • 我运行了它,它工作正常,但在我的项目中,我仍然在基础设施之前加载了 MainStepperModule。如果是因为 MainStepperModule 包含使用的初始视图,我会徘徊
  • 我不建议您将基础架构模块作为模块加载。模块应该有一个对基础设施库的硬引用。可以分享一下代码吗?
  • @LuftWaffle 因为您的所有项目都与基础架构库相关。接口位于这个库中,对于松散耦合的应用程序,您必须使用这些接口而不是模块类名。尝试从您的应用程序中排除所有属性(仅在实现 IModule 接口的类中)并在您的 ConfigureModuleCatalog 方法中重复代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 2016-08-14
  • 2021-08-22
相关资源
最近更新 更多