我有两个模块:一个模块注册一些服务并在其上使用它们。 但是,第二个模块首先加载,然后引发有关无法解析服务的异常。
为了测试,我将服务注册移至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
中。
答案 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的示例。