我目前正在尝试发现聚合根背后的想法及其与存储库的关系。
给出以下域实体:
public class Country {
public string Name { get; set; }
public ICollection<City> Cities { get; set; }
}
public class City {
public string Name { get; set; }
}
我想我正确地将国家确定为城市的聚合根,因为在我的域中,不应该有任何城市不在一个国家内。应该只能通过一个国家向数据存储添加一个新城市,如果一个国家被删除,那么每个城市也应该被删除。
现在,这样的国家/地区存储库看起来如何? 国家聚合根的外观如何?域内是否有 CityRepository (即使没有相关国家,我也可以将城市添加到数据库中!)?在国家/地区中是否存在 CountryRepository (某种程度上该国家需要填充其城市?或者这是存储库的工作?)
答案 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的聚合根。