【问题标题】:How should I get user input in a model using MVVM pattern?我应该如何使用 MVVM 模式在模型中获取用户输入?
【发布时间】:2015-07-26 01:10:39
【问题描述】:

我正在使用 c# 和 MVVM 模式编写程序。该程序具有在线连接,需要登录。我创建了一个模型类来处理登录过程。

登录过程是这样的:登录凭据(用户名和密码)被发送到在线登录页面,成功登录后,服务器发送回登录 cookie。我将这些 cookie 存储在本地,并将它们与来自服务器的每个请求一起发送,直到它们过期。

我在模型中创建了一个 GetLoginCookies() 方法,我希望它是获取登录 cookie 的唯一方法。该方法的登录方式如下:获取存储的登录cookie,并与服务器进行验证。如果没有登录 cookie,或者它们无效(例如过期),则询问用户新的凭据,并将它们发送到服务器并获取新的登录 cookie。

我想用一种方法处理所有事情的原因是,我想有一种方法,它总是给我有效的登录 cookie(或中止操作),我可以在与服务器进行任何通信之前使用它。

我的问题是,在使用 MVVM 模式时实现用户输入的最佳方式是什么?

【问题讨论】:

  • 如果用户需要输入内容,请使用文本框。
  • 我不相信你完全正确地掌握了 MVVM。模型(M)一般只包含data,不负责流程逻辑。我推荐这篇文章 - Implementing the Model-View-ViewModel Pattern。问候
  • @Micky Duncan:在这种情况下,逻辑在哪里?据我了解,视图模型用于特定于视图的逻辑。那么通用逻辑去哪儿了呢?
  • @MickyDuncan:这是一种相当过时的“模型”建模方式,称为贫血域模型。许多专家推荐富域模型,其中属于模型的模型放在模型类中。不属于模型的逻辑进入服务并保持服务层薄。无论如何,在这种情况下,登录机制无论如何都会转到服务,因为它不是特定于模型的逻辑。但是,如果您有“将产品添加到订单”功能,它显然会转到富域模型中的订单模型类,而不是服务中
  • @Tseng 对我来说听起来像是一个臃肿的模型,但不要相信我的话,看看 Blackbird Interactive 如何在他们的 Unity 3D 游戏中使用 MVVM youtube.com/…

标签: c# wpf mvvm user-interaction


【解决方案1】:

您需要服务而不是模型。服务只是一个实用程序类,可以通过依赖注入将其注入到您的 ViewModel 中(您使用的是 IoC?)

鉴于登录只是系统的一部分,并且执行其他 Web 调用需要 cookie,我将为完整的服务器交互创建一个服务。这样,服务可以在内部保留 cookie,您的应用不必担心登录交互的细节。

例如

public class WebService {
    public void Login(string username, string password) { ... }
    public Data GetData() { ... }
    public void AddNewData(Data data) { ... }
}

【讨论】:

  • 感谢您的回答。直到现在我还没有听说过 IoC 和依赖注入,所以我现在有很多研究。一个服务听起来正好适合这个类的功能。但是,让服务调用视图是否“正确”?因为如果存储的 cookie 无效,我仍然需要获取用户交互。
  • @o_z 该服务将由 ViewModel 调用。因此,当您登录该服务时,如果登录失败,ViewModel 会更新 View 以显示这一点(例如通过显示错误消息)。
  • 感谢您的澄清。但是,这似乎仍然不能解决我的问题,因为它不符合我想要的用户体验,即:用户执行需要在线连接的操作(例如下载项目),下载方法询问 GetLoginCookies存储的 cookie,如果它们无效,那么它只会向用户询问凭据。我想避免在绝对必要之前强制用户主动登录。所以调用服务的不是视图模型,而是调用视图的服务。有没有更好的方法来实现这一点?
  • @o_z 啊,我明白了。在服务上执行操作时,服务应该有某种方式来报告需要登录。然后 ViewModel 可以决定打开一个登录视图,或者做其他事情(显示一个错误对话框,静默失败)。另一个选项是允许服务打开登录对话框。这没关系,因为服务是特定于实现的。
  • 我现在必须决定在这种情况下,这两个选项中的哪一个适合我,但你肯定让我走上了正确的道路。谢谢!
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2015-07-25
  • 2018-09-04
相关资源
最近更新 更多