我在哪里将登录逻辑放在WPF中,如何在MVVM中处理它?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在哪里将登录逻辑放在WPF中,如何在MVVM中处理它?相关的知识,希望对你有一定的参考价值。

我目前正在开发一个实现MVVM架构的应用程序,我正在尝试执行登录逻辑。 我非常清楚INotifyPropertyChangedICommand的主要职责是什么,并且已经将它们应用到我需要它们的所有视图模型中。 这是我的代码之一:

我有一个ApplicationViewModel.cs处理主窗口ApplicationView.xaml。 主窗口左侧有一个侧边栏菜单,以及与<ContentControl>CurrentViewModel类型的ViewModelBase属性绑定的ApplicationViewModel.cs。 所有子视图模型都包含在List<ViewModelBase>属性中。它从DataTemplate获得其相应视图模型的视图,从而为我提供了一个有效的导航系统。

所以这就是我最初的想法:

在一个名为LoginViewModel.cs的子视图模型中,我认为执行登录逻辑是合乎逻辑的,因为它也处理了视图本身。我写了一个模型类User.cs,它具有与数据库列相对应的属性。我写了一些类,可以帮助我从数据库中获取数据到应用程序。

视图模型检查输入的字符数,并在用户为pin代码输入4个字符后执行Login,这将在User中实例化LoginViewModel.cs对象

这里的问题是,我需要User的实例应用程序范围,因此可能需要在ApplicationViewModel.cs中。

那么,从那以后,我有两个问题:

  • 有没有更好的方法来处理登录逻辑?
  • 如果我已经制作的逻辑很好,我如何将User的实例从子视图模型LoginViewModel.cs移交给父视图模型ApplicationViewModel.cs
答案

是;当我刚开始时,这个解决方案并不是很自然,但实际上你可以在MVVM中添加某种第四层,即服务层(好吧,它更像是一个模式而不是实际的MVVM层)。

服务是您注入到视图模型中的单实例对象,并且正是为了这种目的而服务,这种目的是保存并可能处理应在视图模型之间传播的数据。

您将需要一个依赖注入器,这个类将为使用它注入的类找到正确的服务而烦恼。

所以你有两个要研究的概念:

  • 服务
  • 控制/依赖注入的反转

我不能只给你一个依赖注入器的实现,因为我个人没有。 我正在使用一个MVVM框架,它已经为我提供了一个。

它基本上是这样使用的:

  • 您为每个服务创建一个接口;它将问题分开(服务实现和视图模型之间没有耦合)。
  • 您可以通过他们的界面注册您的服务实现(类似于程序开头的myDependencyInjector.Register<IMyService>(typeof(MyService))
  • 您将所需的服务接口添加到相关的viewmodels的构造函数(MyViewModel(IMyService myService)
另一答案

您可以通过创建从IIdentityIPrincipal接口派生的类来实现自定义身份验证和授权,并覆盖应用程序线程的默认标识。有关如何执行此操作的详细信息,请参阅以下博客文章。

WPF中的自定义授权:https://blog.magnusmontin.net/2013/03/24/custom-authorization-in-wpf/

您基本上创建了一个IPrincipal并使用AppDomain.CurrentDomain.SetThreadPrincipal方法将此主体与应用程序中的AppDomain相关联。然后,您可以在应用程序的任何位置使用Thread.CurrentPrincipal.Identity.IsAuthenticated属性来确定用户是否经过身份验证。

在代码示例中,实际身份验证由AuthenticationService类完成。例如,您可以实现此方法来检查针对远程数据库传入的凭据。视图模型使用此服务执行身份验证。

以上是关于我在哪里将登录逻辑放在WPF中,如何在MVVM中处理它?的主要内容,如果未能解决你的问题,请参考以下文章

我们一起写框架MVVM的WPF框架—DataGrid

需要调用一个api来使用retrofit在android mvvm中刷新令牌,在哪里编写逻辑?

WPF - 将 DAL 放在 MVVM 的 3 层架构设计中的啥位置?

WPF中的MVVM模式简单实现

我在哪里使用 Core Data 将业务逻辑放在 IOS 应用程序中?

从Caliburn.Micro,WPF,MVVM中的另一个窗口获取信息