如何使用共享模块构建多个Prism Xamarin.Forms应用程序

时间:2018-09-29 15:00:49

标签: c# xamarin.forms prism

我现在开始一个项目,我想使用棱镜模块。 想象一下这种情况:

  • App1(例如Uber App)
  • App2(例如Uber Driver App)
  • AuthenticationModule

项目的结构如何?

  • 可能有3个独立的项目(一个git存储库用于 每)?如果是这样,我如何在App1中都引用AuthenticationModule 和App2?
  • 最好有一个同时包含应用程序和身份验证模块的git存储库(3个解决方案)?

1 个答案:

答案 0 :(得分:0)

“如何构建您的应用”的细节远远超出了StackOverflow可以解决的范围。但是,我会给您一些有关使用Prism Modularity的常规信息,我认为这会有所帮助。

您所展示的场景以一个示例为例,其中每个Uber Passenger应用程序和Uber Driver应用程序都使用相同的用户身份验证流程,这是一个绝佳的用例,其中包含组织可以使用的通用身份验证模块跨应用重复使用。

如何再次选择实现该模块超出了此处可以/应该回答的范围。一种可能的处理方法是包括一个自定义事件,例如:

public class UserAuthenticatedEvent : PubSubEvent<string> { }

从高层次看,您的代码可能看起来像这样:

public class LoginPageViewModel : BindableBase
{
    private IEventAggregator _eventAggregator { get; }
    private IAuthService _authService { get; }

    public LoginPageViewModel(IEventAggregator eventAggregator, IAuthService authService)
    {
        _authService = authService;
        _eventAggregator = eventAggregator;
    }

    private string _userName;
    public string UserName
    {
        get => _userName;
        set => SetProperty(ref _userName, value);
    }

    private string _password;
    public string Password
    {
        get => _password;
        set => SetProperty(ref _password, value);
    }

    public DelegateCommand LoginCommand { get; }

    private async void OnLoginCommandExecuted()
    {
        var jwt = await _authService.LoginAsync(UserName, Password);
        _eventAggregator.GetEvent<UserAuthenticatedEvent>().Publish(jwt);
    }
}

public class App : PrismApplication
{
    protected override async void OnInitialized()
    {
        var ea = Container.Resolve<IEventAggregator>();
        ea.GetEvent<UserAuthenticatedEvent>().Subscribe(OnUserAuthencticated);
        await NavigationService.NavigateAsync("LoginPage");
    }

    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
        moduleCatalog.AddModule<AuthenticationModule>();
    }

    private async void OnUserAuthencticated(string jwt)
    {
        // store jwt for use
        await NavigationService.NavigateAsync("/MainPage");
    }
}

这允许您的用户拥有通用的登录流程,而您的应用程序控制发生的情况以及如何存储jwt以便重复使用。当然,这可以进一步抽象出来……请记住,在您介绍的情况下,驾驶员和乘客都将有一个“用户配置文件”部分和“设置”,这些内容可能可以抽象到模块中……无论模块是否可以模块可在应用程序之间重复使用,通常也很适合将代码放入筒仓中,从而更易于测试和维护。