【发布时间】: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)并且在另一个模块中我尝试将它们与依赖注入一起使用。但是,由于注册码尚未执行,容器无法解析它们