4

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

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

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

4

3 回答 3

3

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

然后,您可以简单地将多个服务注入您的控制器(就像您已经为您的家庭控制器所做的那样),或者您可以创建组合多个服务的类(另请参阅委托外观装饰器模式和重构以聚合服务)并注入这些服务。

于 2013-07-12T13:19:16.847 回答
2

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

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

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

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

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

于 2013-07-12T12:48:03.373 回答
0

在“Programming Microsoft ASP.NET MVC”中,Dino Esposito 推荐了一种他称之为“IPODD”的模式。我对 MVC 的经验很少,但如果你能掌握它,这一章值得一读。我想说它为您的问题提供了经验丰富的见解。

您可以在此处预览本书对 iPODD 模式的解释。

于 2013-07-12T13:14:14.637 回答