具有部分加载对象的域模型

时间:2014-08-01 11:22:46

标签: c# mvvm domain-model

假设我有一个由客户端和服务器组成的应用程序。客户端使用MVVM模式(使用WPF),服务器只是一个WCF服务,它从数据库中获取一些数据并将数据作为DTO对象返回给客户端。在客户端中,DataAccess层将这些DTO转换为域对象并将它们传递给Model。 ViewModel使用Model来获取数据(Domain Object)并用它填充自己。

enter image description here

为了优化数据库性能,每个ViewModel只提供它真正需要的数据,而不是更多(根据许多来源的建议)。例如,我们假设有一个名为DbCustomer的实体,它有30个属性,还有3个与客户相关的不同视图:CustomerProfileViewCustomersListView和{{1 }}。每个视图都需要不同的数据部分:CustomerThirdView使用20个属性,CustomerProfileView使用10个属性,CustomersListView仅使用4个属性。对于每个View,只从数据库中提取所需的属性并将其传递给ViewModel。

现在问题出现了:我应该如何设计我的域对象来支持它?

解决方案1,一个部分加载的域对象(禁止)

如果我只有一个CustomerThirdView域对象被所有ViewModel使用,那么它将具有不同的数据,具体取决于请求它的ViewModel。显然这是一种不可行的方式,因为如果我必须在其他地方使用这个Customer对象,我不能确定它是否有足够的属性加载。

例如,我可能有方法Customer,它应该返回描述客户私人文件路径的字符串。该方法需要属性GetDataStoragePathFirstNameLastNameSSN。现在,让我们说IsExternalCustomer不需要CustomerThirdView,因此在IsExternalCustomer请求模型加载CustomerThirdViewModel时不会加载它。现在,如果我在其他地方使用此Customer(它不是ViewModel特定对象),方法Customer将失败。

解决方案2,三个不同的域对象

在另一个解决方案中,将有3个不同的域对象(用作数据容器),具有合适的接口,然后GetDataStoragePath将仅依赖于此接口。例如:

GetDataStoragePath

这会导致Anemic Domain Model,但在我看来这不是问题。然而,它似乎很乱,因为我可以很容易地想象有20种不同的方法有不同的需求会导致20个接口(并且只有Customer,还有很多其他域对象)。当然,在这个简单的例子中,我可以将所有四个参数分别传递给GetDataStoragePath,但在现实生活中还有更多必需的属性。

还有其他选择吗?什么是解决问题的最佳方法?

1 个答案:

答案 0 :(得分:2)

您的模型显然需要大量数据。为什么不制作3个模型和一个复合模型?

public class CustomerProfile 
{
    public string Phone { get; set; }
    // other profile fields
}

public class Customer 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string SSN { get; set; }
    public bool IsExternalCustomer { get; set; }
    public CustomerProfile Profile { get; set; }
}

然后,您将所有必需的字段放入Customer类,并将其余字段组合在一起,即在CustomerProfile类中。如果是null,那么该数据未被提取且无法使用