MVC服务层 - 每个控制器或其他设计的服务?

时间:2013-07-12 12:43:34

标签: asp.net-mvc design-patterns n-tier-architecture

我有一个带有数据层(NHibernate和Repository模式),服务层和Web(MVC)层的ASP.NET MVC项目。

目前,对于Web层中的每个Controller,我在服务层中都有一个匹配的服务类。这很好,虽然服务类之间存在一些重复的接口和逻辑(多个类需要一个GetThingById()方法),而我的Home Controller使用多个服务(或者在专用的主页中会有大量的重复)控制器)。

有没有更好的方法来构建它?

3 个答案:

答案 0 :(得分:3)

复制通常意味着重构:将重复的逻辑提取到服务中,将所有内容都解决(单一责任原则),直到不再有重复。

然后,您只需将多个服务注入控制器(就像您已经为家庭控制器所做的那样),或者您可以创建组合多个服务的类(另请参阅DelegationFacade,{{ 3}} pattern和Decorator)并注入那些。

答案 1 :(得分:2)

没有银弹,所以你不会在这里得到“正确”的答案。这取决于您的具体情况。

我个人试图避免添加这么多层,除非非常必要,IMO,你需要非常强烈的动力来拥有如此多的抽象层,因为通常你可以用更少的组件创建一个合适的架构。

我会说,对于普通的应用程序,您甚至不需要正式的服务层,因为它最终只是一堆空方法,只是调用存储库中的另一个方法。

如果您需要使用服务层,则每个域实体或每组实体可能更适合拥有一个服务类。不要认为每个控制器都有一个服务类很有意义。如有必要,您可以添加一些辅助类来覆盖通用控制器逻辑。

我用你的方法看到的问题是你的服务层应该是模型的一部分,并且不要认为让它如此依赖你的控制器层是一个很好的策略。

答案 2 :(得分:0)

在“编程Microsoft ASP.NET MVC”中,Dino Esposito推荐了一种他称之为“IPODD”的模式。我对MVC的经验不多,但是如果能掌握它,本章值得一读。我会说它提供了一个经验丰富的洞察你的问题。

您可以预览本书有关iPODD模式here的说明。