繁体   English   中英

汇总根和存储库

[英]Aggregate Roots & Repositories

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

给出以下域实体:

public class Country {

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

}

public class City {

    public string Name { get; set; }

}

我猜我正确地将国家/地区标识为城市总根 ,因为在我的域中,不应有不在国家/地区内的任何城市。 只能通过一个国家/地区将新城市添加到数据存储中,如果删除了一个国家/地区,则也应移除其中的每个城市。

现在,这样的国家/地区存储库可能是什么样子? 国家汇总根的外观如何? 域内是否有CityRepository (即使没有相关国家,这也允许我向数据库中添加城市!)? 并且在国家内部是否存在CountryRepository (以某种方式该国家需要填充其城市?还是这是存储库的工作?)

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

因为在我的领域内,不应有一个国家或地区以外的城市。 只能通过一个国家/地区将新城市添加到数据存储中,如果删除了一个国家/地区,则也应移除其中的每个城市

您是正确的,国家是总根。 您所在国家/地区的实体代码是汇总根,它是正确的! 您不想要城市回购。 您所在国家/地区的repo并不会真正根据相关的价值对象(在这种情况下为城市)或实体而变化,因此在这种情况下,您的基本Crud API如下所示:

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

触摸最后一个问题:

并且在国家内部是否存在CountryRepository(以某种方式该国家需要填充其城市?还是这是存储库的工作?)

您的存储库将负责该活动(实体的处理)。 可以通过维护集合在实体中完成城市填充。 您可以在“国家/地区”实体上添加城市的方法:

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

删除将是类似的,那么您可以使用您的存储库来保存国家/地区,该国家/地区应保留相关的城市集合。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM