gpt4 book ai didi

c# - 具有部分加载对象的领域模型

转载 作者:行者123 更新时间:2023-11-30 12:27:29 25 4
gpt4 key购买 nike

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

enter image description here

为了优化数据库性能,每个 ViewModel 只提供它真正需要的数据,仅此而已(正如许多来源所推荐的那样)。例如,假设有一个名为 DbCustomer 的实体,它有 30 个属性,还有 3 个与客户相关的不同 View :CustomerProfileViewCustomersListViewCustomerThirdView。每个 View 都需要不同部分的数据:CustomerProfileView 使用 20 个属性,CustomersListView 使用 10 个属性,而 CustomerThirdView 仅使用 4 个属性。对于每个 View ,只从数据库中获取所需的属性并将其传递给 ViewModel。

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

解决方案 1,一个部分加载的领域对象(不行)

如果我只有一个被所有 ViewModel 使用的 Customer 域对象,它会根据请求它的 ViewModel 具有不同的数据。显然这是行不通的方法,因为如果我必须在其他地方使用此 Customer 对象,我无法确定它是否加载了足够的属性。

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

方案二,三个不同的Domain Object

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

public interface ICanGetDataStoragePath {
string FirstName { get; }
string LastName { get; }
string SSN { get; }
bool IsExternalCustomer { get; }
}

public CustomerProfileData : ICanGetDataStoragePath { ... } // Implements interface
public CustomerListViewData : ICanGetDataStoragPath { ... } // Implements interface
public CustomerThirdViewData { ... } // Does NOT implement interface

public class CustomerLogic : ICustomerLogic {
public string GetDataStoragePath(ICanGetDataStoragePath customer) {...}
}

这将导致 Anemic Domain Model但我认为这不是问题。然而,它看起来很困惑,因为我可以很容易地想象会有 20 种不同的方法具有不同的需求,这将导致 20 个接口(interface)(并且仅针对客户,还有很多其他域对象)。当然,在这种简单的情况下,我可以将所有四个参数分别传递给 GetDataStoragePath,但在现实生活中,还需要更多属性。

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

最佳答案

您的模型显然有太多数据。为什么不制作 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,则该数据未被提取且不可用

关于c# - 具有部分加载对象的领域模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25079177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com