当前位置: 首页 > 编程语言 > C#

在Repository层查询多个实体应该返回什么类型?分享

时间:2023-04-11 00:49:23 C#

Repository层查询多个实体应该返回什么类型?我在这个问题中涵盖了以下几层:很多时候它非常简单:存储库层通过EntityFramework查询数据库并将IList返回给调用者,即调用者服务层。返回的类型是域模型中定义的类型。我遇到的问题是当我需要查询POCOA、B和C并从中获取所有数据以返回时。由于我不处理存储库中的任何逻辑,因此我需要将此数据返回到服务层进行处理(直接或更有可能通过调用域模型上的某些逻辑)。但是,我再次从存储库查询结果中没有类型返回给调用者。在我见过的示例中,一个匿名类型类会处理这个问题,但由于我没有直接在存储库中从返回的数据中处理该逻辑并且需要返回它,所以我需要一个物理类型来返回。以下是我想到的一些解决方案,但不确定我是否喜欢:在域模型中创建一个新的域实体,它实际上是我正在查询的所有数据的组合,因此可以返回这个新的单一类型。创建一个任意类型来满足查询需求似乎是错误的。让服务层分别调用A、B、C实体上各自的存储库,然后处理每个返回对象的数据。这似乎有很多额外的工作。创建要返回的ViewModel。这对我来说似乎也不对。我在服务层和UI层之间经常使用ViewModel类,但从来没有看到它们被用于从存储库返回。我不可能是唯一一个查询多个实体以获取需要添加到类型并返回给调用者的数据集合的人。解决我的问题的常见做法或标准方法是什么?谢谢!如果实体是相关的,并且您在一个地方查询所有实体,那么您应该尝试在您的域模型中找到它们的聚合根,或者如果它不存在,您应该像第一个一样引入一个新实体其中描述的选项。在它有意义之前,它没有任何问题。它应该对域概念建模,您可能拥有一个,因为您创建了该存储库方法。如果实体不相关(好吧,也许在某种程度上,但不像上面那样)并且你只想一次获取它们,那么你应该在服务层处理它,在那里你可以使用多个存储库并组合一个结果目的。你可能听说过导航属性和预加载的概念,但我在这里写它是因为它可能是你问题的另一个答案(我没有看到你的域模型)我不同意你的第三个建议(在存储库中创建视图模型)因为它破坏了颜色分离。不同的实体可以相互关联,其中一个实体是聚合根。服务用于这些类型的查询。我通常这样做:publicclassMyService{IEnumerableFind(){varmessages=_messageRepository.FindAll();varuserIds=_messages.Select(x=>x.UserId).Distinct().ToArry();varusers=_userRepository.Find(userIds);returnusers.Select(x=>newUserWithMessages(x,messages.Where(x=>x.UserId==x.Id));}}数据库中只能使用两个数据库查询所以它应该很快。我推荐你为此目的使用DTO(数据传输对象)。将服务层与视图分开是一种常见的做法,DTO允许你只共享视图所需的重要信息。根据系统的大小,有多种方法可以实现这部分系统。在小型系统中,可以使用扩展方法来映射DataTransferObjects中的POCO实体。我建议你看看“AutoMapper”。我认为它对你真的很有用有用的http://www.codeproject.com/Articles/61629/AutoMapperhttp://lostechies.com/jimmybogard/2009/01/23/automapper-the-object-object-mapper/以上是C#学习教程:在Repository中应该用什么类型层中查询多个实体时返回?所有内容分享,如果对你有用,需要详细了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: