【发布时间】:2019-02-25 11:48:01
【问题描述】:
目前正在开发一个离线优先的 Xamarin sale's force 应用程序,我有一个关于 MVVM 架构的问题:我的应用程序目前有 4 个共享解决方案:Abstraction、Core、DAL 和 UI(当然还有 Platform/iOS 和 Platform/机器人)。每个解决方案都是不言自明的——抽象包含接口,核心包含所有业务逻辑(事件、模型、视图模型等),DAL 所有数据库实体(因为我正在使用领域,所以我没有使用存储库,只是每个 VM 中的普通领域实例),最后是 UI,它包含所有 UI(呵呵)。
好吧,那么,回到问题上来……假设我有这个:
Order : RealmObject -> 加载 OrderViewModel 时,它会调用 _realm.All 并订阅通知。然后将每个 RealmObject 转换为 OrderModel 并加载到 ObservableCollection AllProducts 中。这很好用。
现在,在我的 AddOrderPage 中,我有一个包含用于下订单的基本数据的表单。问题是:我的 AddOrderPageViewModel 应该拥有每个 OrderModel 属性,还是应该简单地使用 OrderModel 属性?基本上是这样的:
public class OrderViewModel {
OrderModel _order;
public OrderModel Order {
get => _order;
set {
_order = value;
RaisePropertyChanged(nameof(Order));
}
}
public SaveOrder()
{
// do validation
_realm.Save(_order);
}
}
或者:
public class OrderViewModel {
decimal _amount;
public decimal Amount (...)
decimal _price;
public decimal Price (...)
(...)
public SaveOrder()
{
var order = new Order { ..., _amount, _price);
// do validation
_realm.Save(order);
}
}
乍一看,这可能是一个愚蠢的问题,但我主要关心的是:我应该从模型中提出 propertyChanges 吗?它不会伤害 POCO 原则吗?例如,如果 OrderModel 包含一个 ObservableCollection(甚至是一个 List)_orderDetails,并且当它更新时,它也应该在 TotalPrice 上引发一个 propertyChanged,在 Model 上这样做是否正确?
【问题讨论】:
-
我建议您实现一个可以调用 INotifyProperty 方法的 ViewModelBase。此外,如果您正在开发一个大型应用程序,您可能应该考虑实现一个 MVVM 助手。我使用并推荐 prism,他们有大量很好的示例和视频,向您展示了构建 mvvm xamarin 应用程序的最佳实践!
-
您好,@Axemasta!实际上,这只是一个示例代码。巧合的是,我正在使用 Prism,所以,所有方法都使用 SetProperty ;)
-
嗨@Fábio 很高兴听到您正在使用 MVVM 助手。如果您转到 prism 的 youtube 频道(我不会链接以防链接失效),他们有一个名为“使用代表命令”的视频。该视频向您展示了使用视图模型的 getter/setter 的最佳实践。您可以将实体保存在设置器中,但它可能会变得非常混乱,如果您想这样做,您需要对它们进行空检查,否则您可能会遇到破坏视图模型的问题(绑定将在其值为空时更新)。不过,Prism 已经为您介绍了,他们的视频、文档和操作系统贡献很棒,请关注他们!
-
嘿,@Axemasta,感谢您的提示。我花了一些时间观看视频,它真的很有用,我打算尽快观看更多视频。
-
Prism 实际上有一个私人 slack 组,您可以通过在他们的 patreon 上承诺 1 美元之类的东西来访问它。它非常有用,而且小组中的人(不仅仅是维护者)知识渊博且乐于助人。
标签: model architecture viewmodel