C# 领域驱动设计:如何检索复杂数据列表

C# 领域驱动设计:如何检索复杂数据列表,c#,oop,domain-driven-design,C#,Oop,Domain Driven Design,我一直在使用我目前对领域驱动设计的理解构建一个新的应用程序。到目前为止,我有一组表示域中实体的类和一个从数据库检索/持久化到数据库的存储库 我遇到的问题是,在UI中,我需要显示一些列表,其中列表中的项目不会直接映射到我域中的任何实体。列表中的一些数据可以通过对某些实体进行相当深入的加载来构建,但其他数据基本上是在检索时合成的,不属于任何实体。让我举个例子,希望能更清楚地解释这个问题 在我的领域中,我有评估(一组要回答的问题)和对这些评估的回答(每个用户提供给评估的答案)。我也有行动。每个操作都代

我一直在使用我目前对领域驱动设计的理解构建一个新的应用程序。到目前为止,我有一组表示域中实体的类和一个从数据库检索/持久化到数据库的存储库

我遇到的问题是,在UI中,我需要显示一些列表,其中列表中的项目不会直接映射到我域中的任何实体。列表中的一些数据可以通过对某些实体进行相当深入的加载来构建,但其他数据基本上是在检索时合成的,不属于任何实体。让我举个例子,希望能更清楚地解释这个问题

在我的领域中,我有评估(一组要回答的问题)和对这些评估的回答(每个用户提供给评估的答案)。我也有行动。每个操作都代表一个响应(提交、批准、拒绝等)所采取的操作。我也有用户

我需要显示的其中一个数据列表将包括响应和评估(尚未响应),然后每行将包括当前正在处理响应的用户的信息(这在检索时通过查看已对响应采取的操作来确定)。每个行项目还将包括零个或多个子项目,这些子项目是迄今为止针对响应采取的措施


问题是,到目前为止,我没有任何方法用我的域实体来表示整个数据集。我的第一反应是从数据库中检索一个datatable并绕过我的域实体。但是,我认为处理域对象以及将不同实体之间的关系烘焙到对象本身中有很大的价值。因此,我的下一个想法是修改我的域实体以支持这些列表,但我担心我会向我的实体添加奇怪的属性以支持这些列表场景,而且我可能会因为在我的应用程序中只需要几个地方的数据而实质上大量加载对象而影响性能

我建议不要将此视为必须硬塞进实体的东西,而是提供一个服务(用领域驱动的设计术语来说),其工作是在请求时收集此数据并将其作为视图显示。这使您不必以笨拙的方式返工实体

问题是,到目前为止,我没有任何方法用我的域实体来表示整个数据集


你在这里感受到的笨拙的设计摩擦是件好事。这是一个线索,表明事情不太协调。

听起来您(通过出现这种困难)发现了域模型的一个问题。显然,您希望在每个列表框中显示的抽象在您的域模型中以及在您的“无处不在的语言”中都没有得到很好的表示。决定它是什么,命名它,并将代码添加到您的存储库中,以生成这些对象的列表,不管它们是实体还是值对象

事实上,我可能误解了当前的问题,但我的初步印象是域实体只需要额外的属性:即响应实体应该有一个Actions(或ActionHistory)属性来表示“迄今为止对响应采取的操作”。听起来您理解我的问题。我正在考虑添加这些额外的属性,但老实说,我担心的一部分是,在某些时候加载的数据可能比我真正需要的要多。这些操作非常简单,不会有什么问题,但是我的用户实体非常复杂,当我真正需要的只是用户id和名称时,加载整个用户似乎需要很多额外的工作。但对我来说,部分加载实体似乎真的很麻烦。如果这是一个性能/优化问题,那么John Feminella的答案(创建一个服务方法来处理它)肯定是合适的。话虽如此,许多OR/M工具将允许您延迟加载这些属性(当然,如果您不使用其中一个或滚动您自己的数据访问层/存储库,这是没有意义的)。我希望使用NHibernate,但由于一些我不想讨论的业务限制,我不得不滚动我自己的ORM。我将更深入地了解John Feminella提出的服务方法。如果一个实体对于应用程序域中使用的某个功能来说过于复杂,那么可能需要将其分解为更小、更简单的抽象,以便更好地满足应用程序的功能需求。好的,我现在正在阅读服务。当您说服务将以视图的形式呈现数据时,视图是什么?它是一个仅为此目的定义的类吗?它是由域实体组成的吗?我使用的是MVC意义上的视图——也就是说,它的工作就是向您展示东西。实际相关数据将由服务聚合,然后将视图交给服务并要求显示(在您的情况下,这就是您提到的“数据列表”)。一个服务可能会决定在将内容传递给视图之前将其封装在单独的类中(特别是当许多视图使用相同的数据时),但这绝不是必需的。