在Asp.net mvc中是否应该有一个服务层?

8
在Asp.net MVC中,控制器和存储库之间是否应该有一个服务层?因为存储库只用于数据访问。一些业务逻辑泄露到控制器中。如果同一操作被经典的Asp.Net客户端使用,则可能会出现问题,因为我们必须在控制器中复制逻辑。
6个回答

10
如果你要严格遵循领域驱动设计,你会发现有3种类型的服务(不知道大家是否喜欢这种术语的重载?)。
  • 领域服务:封装了业务逻辑,这些逻辑不自然地适用于领域对象,并且不是典型的CRUD操作 - 这些操作应该属于存储库
  • 应用程序服务:由外部消费者用于与您的系统交互(想象一下Web服务)。如果消费者需要访问CRUD操作,则会在此处公开(但由适当的存储库处理)
  • 基础设施服务:用于抽象技术问题(例如MSMQ,电子邮件提供商等)

听起来像是需要领域服务来封装/分享您的业务逻辑。

希望这能帮到您!


4
说实话,我在这个问题上有过两种看法。我的当前观点是,仓储库一项服务,它只是处理域聚合根的CRUD操作的工作的服务而已。如果你的“repositories”与实体直接映射1:1(因此,更像是DAO而不是repositories),那么我可以理解这种争论。但通常情况下,我会根据需要添加抽象层,但只有在证明对于特定应用程序需要它们时才添加。否则,你就会过度设计。

2
就像我说的那样,我会根据需要添加抽象层。需求变更会稍微改变设计,但是服务也可以实现您的存储库接口,这没有任何问题。 - Paul

3

我喜欢服务层在我的控制器和仓库之间提供的额外抽象层级。我觉得这有助于极大地实现单一职责原则。


2
使得测试变得更加容易。 - Hal

3
我对此进行了一些实验。我正在构建的应用程序相当CRUD,我的服务层最终暴露了与我的存储库几乎相同的接口。此外,大多数服务调用没有在repo上添加任何额外的逻辑,它们只是传递方法。唯一一个服务层做出任何事情的地方是在更新或插入新记录时。我决定在基于CRUD的系统中,服务层比增加价值更加耗费时间。最终,我扩展了我的业务模型类,以便将服务逻辑公开为针对模型的操作,从而保持我的控制器方法简洁干净。
然而,在更具行为驱动的系统中,我认为服务层可能会增加更多的价值。

2

我强烈建议使用服务层,这样你可以在不同的Web应用程序之间共享常见功能。也许现有的架构已经存在,你想在前端添加一个新的MVC网站。

对于从头开始构建的简单架构来说,这可能是过度设计。


1

我喜欢在大多数情况下直接将存储库放在控制器中,并在感觉有泄漏的情况下创建服务。我尝试拥有丰富的领域对象,但在那些逻辑不适合领域类的情况下,我会创建一个服务。


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