领域驱动设计 - 存储库创建

时间:2014-03-04 16:27:19

标签: c# domain-driven-design

非常对DDD很新(并且可能很困惑)但我在阅读了一些书籍和教程之后继续学习,并希望为朋友创建一个非常简单的示例项目。如果没有问题,我想问一些关于如何继续的建议!

我有一家拥有员工,员工进行销售的测试公司。概念证明是创建/读取/更新/删除他们所做的员工和销售。另一个需要是提供他们所做销售的统计数据(按季度,按年,按月,按天计算,我相信更多会在稍后出现)。一个非常特殊的页面将显示所有事物的统计数据 - 该公司的员工数量,销售额最高的员工数量,按季度,按年度,按月和按天计算的销售总额为所有员工。此外,我们的目标是展示一年中最好的一周,以及一周中最好的一天(因此,如果本周一的星期一销售量大,那就表明等等。)

我的问题是否有人可以告诉我:

1)我可以为员工和销售组合建立一个存储库吗?那是我的聚合根吗?当你遇到需要对数据进行大量分析的情况时呢?这样做(总和,计数,组等)比在代码中尝试任何东西要快得多,所以我需要大量的Sql语句来总结并返回数据。我应该创建一个存储库,其唯一的工作是处理将用于报告的数据吗?或者它是否属于同一个存储库,即使它会引入更多代码?应该返回什么类型的数据?我正在考虑制作“年度报告”课程和“每周报告”课程或类似的东西。不好主意?

2)如果不知何故,我必须添加一个新的存储库(假设办公室中的设备),在上面的特殊页面上,我想显示水冷却器的数量,引用两个存储库是否可以接受获取数据(我理解在网格中显示无关数据点的声音是多么荒谬,但我们只是说它是必需的)。当您从不同的事物中获取数据子集以显示在组合页面上时,有什么好方法?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

  

我可以为员工和销售组合建立一个存储库吗?

当然可以,但这会打破single responsibility principle。这听起来不是一个好主意。

  

这是我的聚合根吗?

不,聚合根是您可以传递到存储库以进行CRUD操作的域对象。聚合根是可用于存储库上的CRUD操作的最小可能对象。因此,如果您的Employee对象具有Roles对象且Employee对象是聚合根,那么您的EmployeeRepository将无法处理Roles对象。

  

当您遇到需要对数据进行大量分析的情况时,该怎么办?这样做(总和,计数,组等)比在代码中尝试任何东西要快得多,所以我需要大量的Sql语句来总结并返回数据。我应该创建一个存储库,其唯一的工作是处理将用于报告的数据吗?

那将是一个好主意。将计算保留在数据库中,并通过ReportRepository检索计算出的数据。

  

或者它是否属于同一个存储库,即使它会引入更多代码?应该返回什么类型的数据?我正在考虑制作“年度报告”课程和“每周报告”课程或类似的东西。不好主意?

不错。试想一下如何防止重复代码。 YearlyReport可能与WeeklyReport没有什么不同。也许它们都可以简单地成为具有不同时间范围的报告,或者它们可以从相同的基类继承。

  

如果以某种方式下线,我必须添加一个新的存储库(让我们说在办公室里的设备),在上面的特殊页面上,我想显示水冷却器,是否可以引用两个存储库来获取数据(我理解在网格中显示无关数据点的声音是多么荒谬,但我们只是说它是必需的)。

设计明智我认为使用多个存储库来制定答案没有问题。它可能表现不佳。

  

当您从不同的事物中获取数据子集以显示在组合页面上时,有什么好方法?

如果您不知道它们将会是什么,您将不得不在域模型中抽象出这些内容。