Domain driven design 为什么不把数据访问层一分为二呢?

Domain driven design 为什么不把数据访问层一分为二呢?,domain-driven-design,data-access-layer,Domain Driven Design,Data Access Layer,无论我在哪里看到,我都注意到域驱动设计(DDD)和实体水合方法都试图直接从数据层填充实体。我不同意这种做法。这并不是因为这些方法不起作用,而是因为它们确实起作用。相反,我认为这样的方法对于测试目的来说透明度很低。我建议在数据访问层,检索数据以填充字典,而不是直接填充实体本身。这有几个原因: 首先,有更大的灵活性。可以填充每个结果集的字典。稍后我们将决定可以从这些结果集中填充哪些实体 其次,确定数据检索失败的位置所需的数据层知识较少。我们仍然可以编写用于验证数据检索的测试,而不必了解其关联的复杂域

无论我在哪里看到,我都注意到域驱动设计(DDD)和实体水合方法都试图直接从数据层填充实体。我不同意这种做法。这并不是因为这些方法不起作用,而是因为它们确实起作用。相反,我认为这样的方法对于测试目的来说透明度很低。我建议在数据访问层,检索数据以填充字典,而不是直接填充实体本身。这有几个原因:

首先,有更大的灵活性。可以填充每个结果集的字典。稍后我们将决定可以从这些结果集中填充哪些实体

其次,确定数据检索失败的位置所需的数据层知识较少。我们仍然可以编写用于验证数据检索的测试,而不必了解其关联的复杂域实体工厂


有一个所谓的缺点,性能?穿过两层比穿过一层慢?是的,但是通过单个数据层获得的性能增益在这里是负的。我之所以这样说,是因为字典和这些字典将填充的条目都将被缓存。所以,如果有什么问题的话,那就是内存开销。我认为获得上述两个优势是值得的。

似乎测试是问题(“出于测试目的”),因此我建议您使用@tschmuck指出的方法


,它们可能会为您提供不必要的千层面代码(即太多层),但它们会为您提供灵活性。您可以自己实现伪造/测试间谍,模拟和存根它们,还可以使用内存中的数据库,比如SQLite,依赖类也很高兴

我不完全确定我是否理解你在这里的建议或问题是什么。我认为这属于一篇博客文章……问题是为什么不将数据访问层一分为二?那么“字典”中会存储什么呢?每个实体的财产袋?我认为一个代码示例将有助于描述您的建议,但对我来说,这似乎是一个额外的工作,我很难理解这一点。在DDD中,您将拥有类似内存中数据集合的存储库。存储库位于任何一个为支持持久性而实现的数据访问层之上。在这些存储库中,您还可以实现缓存机制。。。我也不完全明白你要去哪里?