c# - 使用视图模型中的属性值实现方法的最佳实践是什么?
问题描述
我目前正在开发一个 UWP 应用程序,但我认为这个问题适用于任何具有 UI 的项目类型。我使用新的 Microsoft Toolkit MVVM 库为我的 UI 构建了一个视图模型。它具有以下属性:
private bool _isLoginAvailable = true;
public bool IsLoginAvailable
{
get => _isLoginAvailable;
set => SetProperty(ref _isLoginAvailable, value);
}
此外,我有一些业务方法作为参数需要多达 5-6 个这些属性。
在论坛上阅读,我发现视图模型中的业务逻辑是不明智的,因此,我提出了以下选项:
- 为方法创建一个新类,并使用视图模型作为参数:
SampleMethod(SampleViewModel vm)
. 然后,如果我在视图模型中创建此类的对象,我可以使用SampleMethod(this)
. 在这一点上,我真的看不出这个选项和在视图模型类中包含方法之间的区别。 - 我看到的第二个选项是将每个必需的参数添加到方法中,并在元组中返回每个参数:
SampleMethod(var1, var2, var3...) { return (var1, var2, var3...)}
这对我来说似乎很麻烦。 - 我想到的第三个选项是使用 MVVM Toolkit 的消息传递功能。在这种情况下,我可以设置视图模型的构造函数来监听消息
Messenger.Register<SampleViewModel, Var1Message>(this, (r, m) => r.var1 = m.Value);
。然后,不同类中的方法可以使用Messenger.Send(new Var1Message(message)
. 虽然这似乎是最好的选择,因为它可以与依赖注入一起轻松实现,但很快就会变得非常复杂,因为每个属性都需要一个新的密封类来描述消息。
这些选项中的任何一个是最佳实践,还是有一个我不知道的选项?
解决方案
如果业务方法需要 VM 中的多个属性,那么这些属性是否应该在业务对象中?这些属性是业务规则所固有的,还是仅存在于视图的上下文中?
VM 属性可以直接传递给业务属性,或者您通常可以直接在 VM 中公开业务对象本身。
推荐阅读
- php - 无法在 centos 7 中安装 ssh2
- php - 路径 /module.json 中不存在文件
- android - android - 如何在不影响导航栏的情况下为 statsbar 设置渐变?
- javascript - 如何使用fabricJS在画布上水平和垂直对象之间均匀间隔?
- php - 包含警报的 Javascript 代码在 PHP 中不起作用
- android - 添加新项目时,Jetpack Compose 模型列表变得混乱
- java - 在java中计算时差
- flutter - Dart中的方法输入参数是否应该添加下划线(_)前缀?
- mongodb - 使用 docker 容器对 mogodb 进行分片:docker-compose MongoDB 错误:尝试在主机上运行命令“isMaster”时出现网络错误
- typescript - 如何在 AWS CDK 的 CfnBucketPolicy 中提供 policyDocument