我在哪里将登录逻辑放在WPF中,如何在MVVM中处理它?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在哪里将登录逻辑放在WPF中,如何在MVVM中处理它?相关的知识,希望对你有一定的参考价值。
我目前正在开发一个实现MVVM架构的应用程序,我正在尝试执行登录逻辑。
我非常清楚INotifyPropertyChanged
和ICommand
的主要职责是什么,并且已经将它们应用到我需要它们的所有视图模型中。
这是我的代码之一:
我有一个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)
)
您可以通过创建从IIdentity
和IPrincipal
接口派生的类来实现自定义身份验证和授权,并覆盖应用程序线程的默认标识。有关如何执行此操作的详细信息,请参阅以下博客文章。
WPF中的自定义授权:https://blog.magnusmontin.net/2013/03/24/custom-authorization-in-wpf/。
您基本上创建了一个IPrincipal
并使用AppDomain.CurrentDomain.SetThreadPrincipal
方法将此主体与应用程序中的AppDomain
相关联。然后,您可以在应用程序的任何位置使用Thread.CurrentPrincipal.Identity.IsAuthenticated
属性来确定用户是否经过身份验证。
在代码示例中,实际身份验证由AuthenticationService
类完成。例如,您可以实现此方法来检查针对远程数据库传入的凭据。视图模型使用此服务执行身份验证。
以上是关于我在哪里将登录逻辑放在WPF中,如何在MVVM中处理它?的主要内容,如果未能解决你的问题,请参考以下文章
需要调用一个api来使用retrofit在android mvvm中刷新令牌,在哪里编写逻辑?
WPF - 将 DAL 放在 MVVM 的 3 层架构设计中的啥位置?