聚集根和&库

时间:2014-05-09 14:42:51

标签: c# design-patterns domain-driven-design ddd-repositories aggregateroot

我目前正在尝试发现聚合根背后的想法及其与存储库的关系。

给出以下域实体:

public class Country {

    public string Name { get; set; }
    public ICollection<City> Cities { get; set; }

}

public class City {

    public string Name { get; set; }

}

我想我正确地将国家确定为城市聚合根,因为在我的域中,不应该有任何城市不在一个国家内。应该只能通过一个国家向数据存储添加一个新城市,如果一个国家被删除,那么每个城市也应该被删除。

现在,这样的国家/地区存储库看起来如何? 国家聚合根的外观如何?域内是否有 CityRepository (即使没有相关国家,我也可以将城市添加到数据库中!)?在国家/地区中是否存在 CountryRepository (某种程度上该国家需要填充其城市?或者这是存储库的工作?)

2 个答案:

答案 0 :(得分:3)

我认为你掌握了它。在您描述的情况下:

  

因为在我的域名中,不应该有任何未找到的城市   在一个国家内。它应该只能添加一个新的城市   通过一个国家的数据存储,如果一个国家被删除,每个城市   里面也应该删除

你是对的,国家是聚合根。您的国家/地区实体代码是聚合根,它是正确的!你不会想要一个城市回购。您的国家/地区回购并没有真正改变,具体取决于相关的价值对象(在本例中为城市)或实体,因此在这种情况下您的基本crud api将如下所示:

public class CountryRepo {
    public Country GetCountry(String name);
    public Country SaveCourntry(Country country);
    public void DeleteCourntry(Country country);
    ...etc...
}

触及你的上一个问题:

  

国家内部是否有一个CountryRepository(不知怎的   国家需要填补它的城市?或者这是一个工作   库?)

您的存储库将处理活动(处理您的实体)。通过维护集合,可以在实体中完成填充城市。您可以在Country实体上创建一个方法来添加城市:

public void AddCity(City city)
{
    this.Cities.Add(city);
}

删除类似,然后您使用您的仓库保存国家,该国家应该负责持久保存相关的城市集合。

答案 1 :(得分:1)

聚合根的选择不仅仅基于分层数据关系。如果您的应用程序可以直接访问City并在不使用Country的情况下在City上执行操作(当然,除了您提到的添加和删除操作),则Country不是City的聚合根。