控制器是否应该直接调用存储库,还是必须通过服务层?或者还有其他选择吗?
在简单的情况下,您不一定需要服务层 - 这只会过度设计解决方案。控制器调用存储库是可以的。但是,如果您发现控制器中的逻辑越来越复杂,或者在控制器操作中重复自己,请考虑在控制器和存储库之间放置一个服务,并将部分逻辑从控制器移至服务层。
我同意@Sosh所说的过度工程观点。但是,我发现通过服务控制器的好处之一是,当通过SOAP / REST在网络上重用该服务时,您的重构工作非常小。请记住,这违反了YAGNI并且是向前思考(在某种程度上)。
但是,再读一遍Jeffrey Palermo的最新书《MVC In Action》后,他有一个没有逻辑的控制器直接与存储库通信,它也可以正常工作。
我一直在处理的所有示例都表明控制器应该对模型进行操作。
话虽如此,我听说有些作者认为模型由从业务逻辑到数据存储库的所有内容组成(而不是许多人认为的业务对象类)。
个人而言,我会尝试通过使控制器对针对存储库进行操作的类进行操作来保持其干净/一致 - 但我认为没有硬性/快速规则反对它。
服务层基本上是您业务逻辑/业务模型的API。例如,您可能有一些方法可以获取“最佳客户”。然后,服务层执行所需的操作来查询存储库,执行所需的任何逻辑等,并返回客户端。在这种情况下,您应该始终通过服务层进行。
但有时您只是检索可能在视图模型中而不在业务模型中的对象。当然,您可以在服务层中添加一个包装器来包装存储库,但这样做会有混淆服务层的风险,并填充无意义的内容。在这种情况下,我认为直接访问存储库没有什么害处。