C# 中的聚合根模式






4.91/5 (13投票s)
C# 中的聚合根模式
聚合根是被视为单个数据单元的对象集群/组。
我相信很多开发人员已经在不知不觉中使用这种模式,我希望通过这篇短文正式告知您您正在做的事情。
让我们尝试通过一个例子来理解上述定义。 考虑以下“Customer
”类,它能够添加多个“Address
”对象。 为了实现这一点,我们公开了来自 customer
类的 address
集合来表示一对多关系。
class Customer
{
public string CustomerName { get; set; }
public DateTime DateofBirth { get; set; }
public List
Addresses { get; set; } } class Address { public string Address1 { get; set; } public string Type { get; set; } }
上面的类结构工作得很好。 您可以创建 customer
的对象并向其添加多个 addresses
对象。
Customer cust = new Customer();
cust.CustomerName = "Shiv koirala";
cust.DateofBirth = Convert.ToDateTime("12/03/1977");
Address Address1 = new Address();
Address1.Address1 = "India";
Address1.Type = "Home";
cust.Addresses.Add(Address1);
Address Address2 = new Address();
Address2.Address1 = "Nepal";
Address2.Type = "Home";
cust.Addresses.Add(Address2);
现在假设我们要实现以下验证
“Customer 只能有一个 Home 类型的地址”。
此时,地址集合是一个 NAKED LIST COLLECTION,它直接暴露给客户端。 换句话说,“Add
”方法没有验证和限制。 所以您可以根据需要添加任何数量的 address
对象。
cust.Addresses.Add(Address2);
那么如何以一种清晰和逻辑的方式解决这个问题呢? 如果您从逻辑上考虑,“Customer
”由 Addressescollection
组成,因此 Customer
就像一个主根。 因此,与其允许直接的 NAKED ACCESS 访问 Addresses
列表,不如考虑从 customer
类访问地址列表。 换句话说,从 customer
类集中访问 address
对象。
以下是我实施的三个步骤,以实现集中化的 address
验证。
步骤 1:我将 address
列表设置为 private
。 因此,不可能直接访问集合。
步骤 2:在“Customer
”类中创建了一个“Add
”方法,用于添加“Address
”对象。 在这个 add
方法中,我们进行了验证,即只能添加一个“Home
”类型的地址。
步骤 3:对于那些想要枚举 address
集合的客户端,我们暴露了“IEnumerable
”接口。
class Customer
{
// Code removed for clarity
private List
_Addresses; // 步骤 1 :- 使列表私有 public void Add(Address obj) // 步骤 2 :- 地址对象通过 customer 添加 { int Count=0; foreach (Address t in _Addresses) { if (t.Type == "Home") { Count++; if (Count > 1) { throw new Exception("只允许一个家庭住址"); } } } _Addresses.Add(obj); } public IEnumerableAddresses // 步骤 3 :- 要浏览,请使用枚举器 { get { return _Addresses; } } }
如果您仔细分析上述解决方案,customer
现在是根,并且 address
对象通过 customer
类进行操作和检索。
我们为什么要这样做? 因为“Customer
”和“Address
”对象是一个逻辑数据单元。 为了维护 address
验证的完整性,我们需要通过“Customer
”类。 同样,数据的加载、更新、删除等都应该通过“Customer
”类来完成,这样我们才能保持适当的数据完整性。
因此,当我们说从数据库加载 customer
时,所有相应的 address
对象也应该被加载。
因此,当一组形成一个逻辑单元的对象应该有一个集中的根,通过该根应该发生对包含对象的操作。 这种安排称为“聚合根”。
进一步阅读,请观看下面的面试准备视频和分步视频系列。