【发布时间】:2011-09-15 12:08:24
【问题描述】:
我正在使用 MVC3 开发第一个大型解决方案。我正在使用 ViewModel、AutoMapper 和 DI。
为了为一些更复杂的编辑/创建创建我的 ViewModel,我注入了 10 个左右
存储库。对于除一个存储库之外的所有存储库,它们仅用于获取数据以填充 ViewModel 上的选择列表,因为我只是获取关联的 FK 实体等。
我看到它提到注入大量存储库是不好的做法,我应该重构。多少比多少?这对很多人来说?我应该如何重构?我应该创建一个返回选择列表等的专用服务吗?
这里举个例子是我的RequirementsAndOffer控制器的构造函数
public RequirementsAndOfferController(
IdefaultnoteRepository defaultnoteRepository,
IcontractformsRepository contractformsRepository,
IperiodRepository periodRepository,
IworkscopeRepository workscopeRepository,
IcontactRepository contactRepository,
IlocationRepository locationRepository,
IrequirementRepository requirementRepository,
IContractorRepository contractRepository,
IcompanyRepository companyRepository,
IcontractRepository contractRepository,
IrequirementcontracttypeRepository requirementcontracttypeRepository,
IoffercontractRepository offercontractRepository)
除了我用来获取需求和报价的 requirementsRepository 和 offercontractRepository 之外,以上所有内容都填充了选择。
更新 一般的想法和更新。 Mark Seemann 关于过度注入的博客文章鼓励我考虑这个问题。我特别感兴趣的是存储库以及为什么我必须注入这个数字。我认为在考虑了我的设计之后,我显然没有为每个聚合根使用一个存储库(根据 DDD)。
例如,我有汽车,汽车有租赁合同,租赁合同有租赁期。
我正在为汽车、租赁合同和租赁期创建一个存储库。所以当我认为应该只有一个时,这就是创建 3 个存储库。没有汽车,租用合同和期限就无法存在。因此,我以这种方式减少了一些存储库。
我仍然有一些复杂的表单(客户需要这些大型表单),这些表单需要控制器中的多个存储库。这可能是因为我没有足够的重构。据我所知,虽然我需要单独的存储库来获取选择列表。
我正在考虑创建某种服务的选项,该服务将提供我需要的所有选择列表。这是好习惯/坏习惯吗?我的服务是否应该只针对聚合根?如果是这样,让一项服务提供选择将是错误的。然而,选择似乎确实是同一类型的东西,并且将它们组合在一起在某些方面很有吸引力。
看来我的问题类似于how-to-deal-with-constructor-over-injection-in-net
我想我现在更多的是寻找关于选择列表服务是好还是坏的具体建议。
任何建议表示赞赏。
【问题讨论】:
-
我认为这里的问题与您的域设计有关。在 DDD(领域驱动设计)中,您不必为领域中的每个实体都有一个存储库。有一个聚合的概念,其中几个域类型被组合到一个聚合中,其中一种类型被降级为根。然后,您将为每个聚合创建一个存储库。我建议阅读这本迷你书,了解 DDD infoq.com/minibooks/domain-driven-design-quickly 的精彩介绍。
-
感谢收到这本书。我确实想知道这是否是一个问题,因为我已经看到很多关于聚合根的讨论。然而,最终用户可以直接添加/创建/编辑等存储库的所有内容。尽管其中许多主要用于填充各种视图上的选择列表。例如,我有一个作为实体的位置,并且各种实体都有与之关联的位置,所以它需要一个自己的存储库以便人们可以添加位置等似乎是合乎逻辑的?
-
由于我在您设计的领域没有经验,很遗憾我无法提供有关设计的直接 cmets。但作为一个例子,让我们看看合同和期间。对我来说,一个时期本身并不存在——我认为它是一个价值对象——而是合同的一部分。因此,合同可以是聚合根,而 period 是该聚合的子节点。然后我会通过合同在这段时间内工作。您将有一个合同存储库来处理合同和期限。当然,根据您的域,情况可能并非如此。
-
另外,如果您想要更快的 DDD 指南并了解 DDD 的各个组件,请查看来自 MSDN 杂志 msdn.microsoft.com/en-us/magazine/dd419654.aspx#id0090074 的这篇文章
-
是的,我会重新阅读 DDD 的内容,看看是否应该减少存储库的数量。
标签: asp.net-mvc-3 dependency-injection repository viewmodel repository-pattern