目前正在开发一个离线优先的Xamarin销售部队应用程序,我有一个关于MVVM架构的问题:我的应用程序目前有4个共享解决方案:抽象,核心,DAL和UI(当然还有Platform / iOS和Platform / Droid)。每个解决方案都是不言自明的 - 抽象包含接口,Core包含所有业务逻辑(事件,模型,ViewModel等),DAL所有数据库实体(因为我正在使用Realm,我没有使用存储库,只是每个VM中的普通领域实例),最后是UI,其中包含所有UI(duh)。
那么,回到这个问题......当然,让我说我有这个:
顺序: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);
}
}
这听起来可能是一个愚蠢的问题,但我主要担心的是:我应该从模型中提出属性变化吗?它不会伤害POCO原则吗?例如,如果OrderModel包含ObservableCollection(甚至是List)_orderDetails,并且在更新时,它还应该在TotalPrice上引发propertyChanged,在Model上完成是否正确?
第一个更适合MVVM,因为模型不应该做任何逻辑。你是正确的,OrderModel不应该有propertyChanges方法 - 它将在视图模型中。该模型应该只具有属性和构造函数。任何进一步的逻辑,如propertyChanged将在访问模型的视图模型中