PRISM 模块化依赖
PRISM Modular dependencies
我有一个关于模块对其他模块的依赖性的问题。我研究了不同模块如何相互通信,但我不确定该使用什么,我非常需要澄清我将如何正确使用它们。
- 如何加载相互依赖的模块?例如
Module A
需要导航到 Module B
它的其中一个视图。我应该先加载 Module A
,然后在需要导航到它时加载 Module B
吗?
如何设置每个模块的依赖关系?我应该在 ModuleCatalog
中配置它们导致 moduleCatalog.AddModule<ModuleB>("ModuleB", InitializationMode.OnDemand, "ModuleA");
还是应该在 Module B
class
[=34 之上配置 [ModuleDependency(ModuleA)]
=]
Module A
需要导航到 Module B
中的其中一个页面,我必须将导航参数传递到 Module B
。我应该使用 shared service
还是 event aggregator
?尽管我想尽可能地减少 event aggregator
的使用
这就是我认为的棱镜之美。
在加载模块的位置方面,您有很大的灵活性。
过去,我使用 IModuleManager 可以将其注入任何模块的 ViewModel 并从那里调用加载方法。
加载方法接受您注册的模块的字符串名称。
注册时,我还将加载类型设置为 onDemand,因此仅当我专门调用加载方法时才加载模块。
所以在您的场景中,您可以在需要时在模块 A 中加载模块 B。
它可能由您的应用程序的某些业务逻辑触发。
要回答您的第二个问题,您可以使用导航服务的导航参数功能简单地传递您的参数
var param = new NavigationParameters();
param.Add("trip", someObject);
await NavigationService.NavigateAsync("TripDetailsPage", param);
编辑:
所以如果你想知道一个模块是否已经加载,你可以做如下的事情:
public class ModuleService : IModuleService
{
private readonly IModuleCatalog _moduleCatalog;
private readonly IModuleManager _moduleManager;
public ModuleService(IModuleCatalog moduleCatalog, IModuleManager moduleManager)
{
_moduleCatalog = moduleCatalog;
_moduleManager = moduleManager;
}
public bool Exists(string moduleName)
{
return _moduleCatalog.Modules.Any(x => x.ModuleName == moduleName);
}
public bool Initialized(string moduleName)
{
return _moduleCatalog.Modules.Any(x => x.ModuleName == moduleName && x.State == ModuleState.Initialized);
}
public void LoadModule(string moduleName)
{
_moduleManager.LoadModule(moduleName);
}
}
因此,通过结合 ModuleManager 和模块目录的功能,我可以使用模块 ModuleState 属性
检查模块是否已加载
我有一个关于模块对其他模块的依赖性的问题。我研究了不同模块如何相互通信,但我不确定该使用什么,我非常需要澄清我将如何正确使用它们。
- 如何加载相互依赖的模块?例如
Module A
需要导航到Module B
它的其中一个视图。我应该先加载Module A
,然后在需要导航到它时加载Module B
吗? 如何设置每个模块的依赖关系?我应该在
[=34 之上配置ModuleCatalog
中配置它们导致moduleCatalog.AddModule<ModuleB>("ModuleB", InitializationMode.OnDemand, "ModuleA");
还是应该在Module B
class[ModuleDependency(ModuleA)]
=]Module A
需要导航到Module B
中的其中一个页面,我必须将导航参数传递到Module B
。我应该使用shared service
还是event aggregator
?尽管我想尽可能地减少event aggregator
的使用
这就是我认为的棱镜之美。
在加载模块的位置方面,您有很大的灵活性。
过去,我使用 IModuleManager 可以将其注入任何模块的 ViewModel 并从那里调用加载方法。
加载方法接受您注册的模块的字符串名称。 注册时,我还将加载类型设置为 onDemand,因此仅当我专门调用加载方法时才加载模块。
所以在您的场景中,您可以在需要时在模块 A 中加载模块 B。 它可能由您的应用程序的某些业务逻辑触发。
要回答您的第二个问题,您可以使用导航服务的导航参数功能简单地传递您的参数
var param = new NavigationParameters();
param.Add("trip", someObject);
await NavigationService.NavigateAsync("TripDetailsPage", param);
编辑:
所以如果你想知道一个模块是否已经加载,你可以做如下的事情:
public class ModuleService : IModuleService
{
private readonly IModuleCatalog _moduleCatalog;
private readonly IModuleManager _moduleManager;
public ModuleService(IModuleCatalog moduleCatalog, IModuleManager moduleManager)
{
_moduleCatalog = moduleCatalog;
_moduleManager = moduleManager;
}
public bool Exists(string moduleName)
{
return _moduleCatalog.Modules.Any(x => x.ModuleName == moduleName);
}
public bool Initialized(string moduleName)
{
return _moduleCatalog.Modules.Any(x => x.ModuleName == moduleName && x.State == ModuleState.Initialized);
}
public void LoadModule(string moduleName)
{
_moduleManager.LoadModule(moduleName);
}
}
因此,通过结合 ModuleManager 和模块目录的功能,我可以使用模块 ModuleState 属性
检查模块是否已加载