ASP.NET MVC - 仓储/服务/控制器

11

控制器是否应该直接调用存储库,还是必须通过服务层?或者还有其他选择吗?

5个回答

11
如果您有一个服务层并且以一种将业务逻辑与存储库分离的方式使用它(正如您应该使用服务层),那么您的控制器应该只调用服务方法。这样,服务层将成为与存储库的耦合。
此外,根据Mayo的答案:模型是将在整个应用程序(repo、服务和UI/controllers)中传递的数据类,因此UI/web层应该像其他层一样“操作”它们。
我认为,如果您按照Fowler的定义modern aspnet mvc adaptions的上下文实现服务层,则应该将控制器操作设计为非常小而轻量级的方法,并从服务层调用“肉”的业务逻辑。
编辑:我想我没有表达清楚:我不是说拥有服务层是唯一的选择,只是试图回答涉及您使用服务层的部分问题。同意,特别是对于较小的项目,服务层并不总是必要的。

8

在简单的情况下,您不一定需要服务层 - 这只会过度设计解决方案。控制器调用存储库是可以的。但是,如果您发现控制器中的逻辑越来越复杂,或者在控制器操作中重复自己,请考虑在控制器和存储库之间放置一个服务,并将部分逻辑从控制器移至服务层。


3

我同意@Sosh所说的过度工程观点。但是,我发现通过服务控制器的好处之一是,当通过SOAP / REST在网络上重用该服务时,您的重构工作非常小。请记住,这违反了YAGNI并且是向前思考(在某种程度上)。

但是,再读一遍Jeffrey Palermo的最新书《MVC In Action》后,他有一个没有逻辑的控制器直接与存储库通信,它也可以正常工作。


0

我一直在处理的所有示例都表明控制器应该对模型进行操作。

话虽如此,我听说有些作者认为模型由从业务逻辑到数据存储库的所有内容组成(而不是许多人认为的业务对象类)。

个人而言,我会尝试通过使控制器对针对存储库进行操作的类进行操作来保持其干净/一致 - 但我认为没有硬性/快速规则反对它。


评论一下为什么你不喜欢这个答案,否则没有人会学到东西。 :) - Mayo
它说的是+1而不是-1?虽然不是我投的票,但这个答案并没有真正帮助到我。在存储库/服务模式中,没有模型,模型是存储库/服务。我想只操作服务,但我不确定这是否会导致过多的代码重复。 - LiamB
我明白了...那可能解释了为什么是-1。我只是假设你在使用不同的术语 - 而不是不同的概念。这给了我今天研究的内容(工作比较慢)。 - Mayo
-1 这个答案没有帮助。把提问者指向模型只会让人感到困惑。请参考我的答案。 - Matt Kocaj
你的模型不应该处理自己的存储库。你应该从控制器(或服务)处理存储库,并从那里获取模型对象的实例。 - UpTheCreek

0

服务层基本上是您业务逻辑/业务模型的API。例如,您可能有一些方法可以获取“最佳客户”。然后,服务层执行所需的操作来查询存储库,执行所需的任何逻辑等,并返回客户端。在这种情况下,您应该始终通过服务层进行。

但有时您只是检索可能在视图模型中而不在业务模型中的对象。当然,您可以在服务层中添加一个包装器来包装存储库,但这样做会有混淆服务层的风险,并填充无意义的内容。在这种情况下,我认为直接访问存储库没有什么害处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接