我现在开始一个项目,我想使用棱镜模块。 想象一下这种情况:
项目的结构如何?
答案 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以便重复使用。当然,这可以进一步抽象出来……请记住,在您介绍的情况下,驾驶员和乘客都将有一个“用户配置文件”部分和“设置”,这些内容可能可以抽象到模块中……无论模块是否可以模块可在应用程序之间重复使用,通常也很适合将代码放入筒仓中,从而更易于测试和维护。