登录Prism WPF应用程序

Keo*_*oki 3 c# wpf prism

我正在使用PRISM开发WPF应用程序,我需要实现在Shell之前加载的Login功能.

  1. 最好的方法是什么?将登录视为模块?将它与壳牌一起放在主项目中?

  2. 如果登录正确,我需要存储一些用户信息(名称,角色等),以便稍后在整个应用程序中使用它(在Shell中以及在模块中).我应该在哪里以及如何存储这些信息?

提前致谢.

And*_*ens 9

本讨论描述了在shell之前显示登录表单的解决方案:http://compositewpf.codeplex.com/discussions/29570

至于如何存储用户的详细信息,您可以使用.Net GenericPrincipalGenericIdentity类.它们允许您表示有关用户的"基本"信息,例如用户名和角色.然后可以针对当前线程存储主体/标识,因此您无需担心创建某种静态/单例类来访问详细信息.检查当前用户的角色成员资格也变得很容易.

创建对象并分配给当前线程,如下所示: -

string[] roles = { "User", "Admin" };
Thread.CurrentPrincipal = new GenericPrincipal(
    new GenericIdentity("Joe"),
    roles);
Run Code Online (Sandbox Code Playgroud)

然后,只要您想访问当前登录用户的详细信息: -

public string GetUsername()
{
    var principal = Thread.CurrentPrincipal;
    var identity = principal == null ? null : principal.Identity;
    return identity == null ? null : identity.Name;
}

public bool IsInRole(string role)
{
    var principal = Thread.CurrentPrincipal;
    return principal == null ? false : principal.IsInRole(role);
}
Run Code Online (Sandbox Code Playgroud)

如果GenericPrincipal并且GenericIdentity不合适,我将创建一个具有必要属性(名称,角色等)的单例类,这些属性可以传递给应用程序的其他部分,例如使用IoC容器.静态类是一种更简单的解决方案(无需传递),但静态可以使单元测试更加棘手.

  • @Shimmy我看了代码已经有一段时间了,但是我们有一个"bootstrapper"类来实现Prism的抽象Bootstrapper类,我们设置了像DI容器(Castle Windsor)这样的东西.在实例化主窗口类之前,我们在bootstrapper的`InitializeShell()`方法中显示登录视图. (2认同)