PRISM模块化依存关系

时间:2019-02-13 05:11:50

标签: xamarin.forms prism

我对模块对其他模块的依赖性有疑问。我已经研究过有关不同模块之间如何通信的信息,但是我不确定该使用什么模块,我非常需要澄清如何正确使用它们。

  • 如何加载彼此依赖的模块?例如Module A需要导航到Module B的其中一个视图。我需要导航到Module A之后再加载Module B吗?
  • 如何设置每个模块的依赖关系?我应该在ModuleCatalog内将它们配置为moduleCatalog.AddModule<ModuleB>("ModuleB", InitializationMode.OnDemand, "ModuleA");还是在[ModuleDependency(ModuleA)]类顶部进行Module B

  • Module A需要导航到Module B中的页面之一,我必须将导航参数传递到Module B中。我应该使用shared service还是event aggregator吗?尽管我想尽量减少使用event aggregator

1 个答案:

答案 0 :(得分:0)

我认为这是棱镜的美。

在模块的加载位置,您具有很大的灵活性。

过去,我使用过IModuleManager,可以将其插入任何模块的ViewModel中,然后从那里调用Load方法。

load方法采用已注册模块的字符串名称。 注册时,我还将加载类型设置为onDemand,因此仅在我专门调用load方法时才加载模块。

因此,在您的情况下,您可以随时在模块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和Module Catalog的功能,我可以使用模块的ModuleState属性来检查模块是否已经加载