假设我有一个由客户端和服务器组成的应用程序。客户端使用MVVM模式(使用WPF),服务器只是一个WCF服务,它从数据库中获取一些数据并将数据作为DTO对象返回给客户端。在客户端中,DataAccess层将这些DTO转换为域对象并将它们传递给Model。 ViewModel使用Model来获取数据(Domain Object)并用它填充自己。
为了优化数据库性能,每个ViewModel只提供它真正需要的数据,而不是更多(根据许多来源的建议)。例如,我们假设有一个名为DbCustomer
的实体,它有30个属性,还有3个与客户相关的不同视图:CustomerProfileView
,CustomersListView
和{{1 }}。每个视图都需要不同的数据部分:CustomerThirdView
使用20个属性,CustomerProfileView
使用10个属性,CustomersListView
仅使用4个属性。对于每个View,只从数据库中提取所需的属性并将其传递给ViewModel。
现在问题出现了:我应该如何设计我的域对象来支持它?
如果我只有一个CustomerThirdView
域对象被所有ViewModel使用,那么它将具有不同的数据,具体取决于请求它的ViewModel。显然这是一种不可行的方式,因为如果我必须在其他地方使用这个Customer
对象,我不能确定它是否有足够的属性加载。
例如,我可能有方法Customer
,它应该返回描述客户私人文件路径的字符串。该方法需要属性GetDataStoragePath
,FirstName
,LastName
和SSN
。现在,让我们说IsExternalCustomer
不需要CustomerThirdView
,因此在IsExternalCustomer
请求模型加载CustomerThirdViewModel
时不会加载它。现在,如果我在其他地方使用此Customer
(它不是ViewModel特定对象),方法Customer
将失败。
在另一个解决方案中,将有3个不同的域对象(用作数据容器),具有合适的接口,然后GetDataStoragePath
将仅依赖于此接口。例如:
GetDataStoragePath
这会导致Anemic Domain Model,但在我看来这不是问题。然而,它似乎很乱,因为我可以很容易地想象有20种不同的方法有不同的需求会导致20个接口(并且只有Customer,还有很多其他域对象)。当然,在这个简单的例子中,我可以将所有四个参数分别传递给GetDataStoragePath,但在现实生活中还有更多必需的属性。
还有其他选择吗?什么是解决问题的最佳方法?
答案 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
,那么该数据未被提取且无法使用