模型或视图模型应该处理模型属性的延迟加载吗?

4
假设我有一个ConsumerModel。ConsumerModel有许多Model属性,其中之一是AddressModel的列表。我希望这个Address属性是延迟加载的,因为它不在ConsumerModel使用的所有地方都被使用。它只在AddressViewModel中使用,用于显示和允许更改Consumer的地址。
谁负责加载AddressModels,是ConsumerModel还是AddressViewModel?
或者是否建议针对这种情况采用替代设计,例如将Addreses列表从Consumer中分离出来,并将其作为AddressViewModel的单独属性处理?
public class ConsumerModel : IModel
{
    private List<AddressModel> _addresses;

    public List<AddressModel> Addresses
    {
        get;
        set;
    }
}
2个回答

3

这段内容应该放在模型中。使用ViewModel模式的目的是首先从视图中删除这些决策。模型负责所有数据收集、组织和管理。ViewModel仅负责确保模型包含的内容输出到UI。虽然将其放在ViewModel中似乎是个好主意,但如果规范下周更改,突然你需要在另一个ViewModel中使用该地址(出于任何原因),你就会打破模式,不得不匆忙处理。


我不确定的部分原因是Model库中没有包含获取数据的WCF服务的引用,只有ViewModel库有。如果我将数据实例化添加到Model中,那么我还必须开始向该库添加对WCF服务的引用。Model库故意没有引用WCF服务,因为它在WCF服务内部使用,添加该引用会创建一个循环引用。 - Rachel
@Rachel - 我一直使用第三方库来进行数据访问。我不是在 ViewModel 中使用引用,而是使用了对我的 DataLibrary(它包含/控制对 Web 服务的访问)的引用。DataLibrary 包含我的自定义数据访问对象,这些对象可以独立地被 ViewModel 和 Model 访问。 - Joel Etherton
是的,实际上我也使用了单独的数据访问库,但我试图简化问题。那么在你的情况下,ViewModel和Model都可以访问获取数据?Model用于获取数据,VM用于保存/添加/删除? - Rachel
@Rachel - 这取决于项目。通常只有模型可以访问数据层,因为视图模型应该使用模型层来执行所有功能。但是,引用库不需要成本,在长期内,从视图模型直接访问数据具有优势。但要小心潜在的循环引用。如果绕过模型层并采用直接访问,可能会错误地填充/使用模型对象。 - Joel Etherton
@Joel。给你点赞,你的回答非常精彩。干杯! - Berryl
@Joel - 感谢你抽出时间解释,现在我更明白了。 - Rachel

1
如果Addresses属性属于ConsumerModel,则ConsumerModel必须负责加载它。 (其他任何事情都会破坏封装/某种设计原则-我对术语不太严格...它只是感觉不对!)
但是,如果Addresses列表仅在AddressViewModel上使用,则可能有理由将属性移动到该ViewModel,并让其处理加载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接