在Asp.net mvc中应该有服务层吗?

时间:2010-02-24 14:15:26

标签: asp.net asp.net-mvc nhibernate domain-driven-design repository-pattern

在控制器和存储库之间的Asp.net MVC中是否应该有服务层?由于存储库仅用于数据访问。一些业务逻辑泄漏到Controller中。如果经典Asp.Net客户端使用相同的操作,这可能会产生问题,因为我们必须在Controller中复制逻辑。

6 个答案:

答案 0 :(得分:10)

如果您按照字母驱动设计进行操作,您会发现 3种服务类型(您不喜欢重载条款吗?)。

  • 域名服务:封装自然不适合域对象的业务逻辑,并且不是典型的CRUD操作 - 那些属于存储库
  • 应用程序服务:由外部使用者用于与您的系统通信(想想 Web服务)。如果消费者需要访问CRUD操作,它们将在此处公开(但由适当的存储库处理)
  • 基础设施服务:用于抽象技术问题(例如MSMQ,电子邮件提供商等)

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

希望有所帮助!

答案 1 :(得分:4)

TBH,我已经双管齐下了。我目前的观点是存储库服务,它只是一个服务,它恰好处理域聚合根的CRUD操作。现在,如果您的“存储库”与您的实体直接映射1:1(因此,不是DAO的存储库),那么我可以看到参数。但一般来说,我会根据需要添加抽象层,但直到证明它们是给定应用程序所需的。否则,你过度工程。

答案 2 :(得分:3)

我喜欢服务层在我的控制器和存储库之间提供的额外抽象级别。我觉得在履行单一责任原则方面有很大帮助。

答案 3 :(得分:3)

我试验了一下。我正在构建的应用程序非常CRUD-y,我的服务层最终暴露出与我的存储库几乎相同的接口。此外,大多数服务调用都没有在repo之上添加任何额外的逻辑,它们只是传递方法。服务层执行任何操作的唯一位置是在更新或插入新记录期间。 我认为在基于CRUD的系统中,服务层引起的摩擦大于增值。我最终扩展了我的业务模型类,以便将服务逻辑暴露为对模型的操作,从而使我的控制器方法保持精简和清洁。

然而,在一个更加行为驱动的系统中,我认为服务层可能会增加更多价值。

答案 4 :(得分:2)

我强烈建议您使用服务层,以便在不同的Web应用程序之间共享通用功能。这可能是架构已经存在的情况,您可能希望在前端添加一个新的mvc网站。

对于从头开始构建的简单架构,它可能有点过分。

答案 5 :(得分:1)

我喜欢在大多数情况下直接在控制器中安装存储库,并在我觉得泄漏的地方进行服务。我尝试使用丰富的域对象,但在那些逻辑不适合域类的情况下,我创建了一个服务。