65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的聚合根模式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (13投票s)

2015年11月13日

CPOL

3分钟阅读

viewsIcon

70666

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 IEnumerable
Addresses // 步骤 3 :- 要浏览,请使用枚举器 { get { return _Addresses; } } }

如果您仔细分析上述解决方案,customer 现在是根,并且 address 对象通过 customer 类进行操作和检索。

我们为什么要这样做? 因为“Customer”和“Address”对象是一个逻辑数据单元。 为了维护 address 验证的完整性,我们需要通过“Customer”类。 同样,数据的加载、更新、删除等都应该通过“Customer”类来完成,这样我们才能保持适当的数据完整性。

因此,当我们说从数据库加载 customer 时,所有相应的 address 对象也应该被加载。

因此,当一组形成一个逻辑单元的对象应该有一个集中的根,通过该根应该发生对包含对象的操作。 这种安排称为“聚合根”。

进一步阅读,请观看下面的面试准备视频和分步视频系列。

© . All rights reserved.