我是DDD和Repository模式的新手,所以我对它的理解可能完全错误。但我正在努力学习它。话虽如此,我需要创建一个显示商店区域的应用程序。我为此目的创建了一个ZoneRepository,到目前为止我用几种方法工作。现在,在该应用程序中,我还需要显示该商店的不同样式。样式列表将用于将它们拖动到各个区域中。现在我的问题是样式类属于哪里,因为它是一种迷你报告。那个“StyleReport”属于存储库吗?它属于其他地方吗?你怎么知道它属于哪里?请帮我理解。
答案 0 :(得分:3)
存储库仅对Aggregate Roots起作用。聚合是围绕被视为一个单元的一个或多个对象的边界。我的意思是,当你操作那些数据(插入,更新,删除等)时,该边界内的所有对象都会受到相应的影响。每个聚合都有一个根。该根是软件其他部分从外部引用的。我想一种描述它的方法是“不依赖别的东西”。
从现有模型的描述中获取域的正确定义有点困难。此外,设计应基于业务模型和需求,而不是UI或应用程序的工作方式。因此,您应该根据您正在解决的一般问题对其进行建模,而不是根据您的想法来解决它。
听起来你有一个实体商店。商店可以划分为一个或多个区域。然后每个区域都有一个或多个StyleReports。听起来像区域依赖于商店,因此商店是聚合根。现在,也许这些StyleReport实体是您在问题域中提供的全局对象集(意味着您可以单独定义StyleReports,在应用程序范围内,并在您的区域中引用它们)。在这种情况下,也许StyleReport也是一个聚合根。
以下是一些示例模型(C#,不确定您使用的是哪种语言)。但是,不要以此为绝对词。如果我不知道您的域名的具体细节,我就不能很好地模拟它。
public class Store
{
public Int32 ID { get; }
public String Name { get; set; }
public IList<Zone> Zones { get; private set; }
public Store()
{
Zones = new List<Zone>();
}
public void AddZone(Zone zone)
{
Zones.Add(zone);
}
}
public class Zone
{
public Int32 ID { get; }
public String Name { get; set; }
public IList<StyleReport> Styles { get; private set; }
public Zone()
{
Styles = new List<StyleReport>();
}
public void AddStyle(StyleReport style)
{
Styles.Add(style);
}
}
public class StoreRepository : Repository<Store>
{
public Store Get(Int32 id)
{
// get store from persistence layer
}
// find, delete, save, update, etc.
}
public class StyleReportRepository : Repository<StyleReport>
{
public StyleReport Get(Int32 id)
{
// get style from persistence layer
}
// find, delete, save, update, etc.
}
因此,在修改商店的区域和添加样式时,可能就是这样的
IRepository<Store> storeRepository = new StoreRepository();
IRepository<StyleReport> stylesRepository = new StyleReportRepository();
Store store = storeRepository.Get(storeID); // store id selected from UI or whatever
// add a zone to the store
Zone someZone = new Zone { Name = zoneNamea }; // zone name was entered by the UI
someZone.AddStyle(styleRepository.Get(styleID)); // style id was selected from UI
storeRepository.Update(store);