DDD与存储库模式和报告混淆

时间:2009-11-05 18:50:02

标签: repository domain-driven-design

我是DDD和Repository模式的新手,所以我对它的理解可能完全错误。但我正在努力学习它。话虽如此,我需要创建一个显示商店区域的应用程序。我为此目的创建了一个ZoneRepository,到目前为止我用几种方法工作。现在,在该应用程序中,我还需要显示该商店的不同样式。样式列表将用于将它们拖动到各个区域中。现在我的问题是样式类属于哪里,因为它是一种迷你报告。那个“StyleReport”属于存储库吗?它属于其他地方吗?你怎么知道它属于哪里?请帮我理解。

1 个答案:

答案 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);