我有一个带有数据层(NHibernate 和存储库模式)、服务层和 Web (MVC) 层的 ASP.NET MVC 项目。
目前,对于 Web 层中的每个控制器,我在服务层中都有一个匹配的服务类。这很好用,尽管服务类之间存在一些接口和逻辑重复(多个类需要 GetThingById() 方法)并且我的 Home Controller 使用多个服务(或者在专用 Home 中会有大量重复控制器)。
有没有更好的方法来构建它?
我有一个带有数据层(NHibernate 和存储库模式)、服务层和 Web (MVC) 层的 ASP.NET MVC 项目。
目前,对于 Web 层中的每个控制器,我在服务层中都有一个匹配的服务类。这很好用,尽管服务类之间存在一些接口和逻辑重复(多个类需要 GetThingById() 方法)并且我的 Home Controller 使用多个服务(或者在专用 Home 中会有大量重复控制器)。
有没有更好的方法来构建它?
没有灵丹妙药,所以你不会在这里得到“正确”的答案。这取决于您的具体情况。
我个人尽量避免添加这么多的层,除非非常必要,IMO,你需要一个非常强大的动机来拥有这么多的抽象层,因为通常你可以用更少的组件创建一个合适的架构。
我想说,对于一个普通的应用程序,你甚至不需要一个正式的服务层,因为它最终是一堆空的方法,只是在你的存储库中调用另一个方法。
如果您需要使用服务层,可能更适合为每个域实体或每组实体拥有一个服务类。不要认为每个控制器都有一个服务类很有意义。如有必要,您可以添加一些帮助类来涵盖常见的控制器逻辑。
我在您的方法中看到的问题是您的服务层应该是模型的一部分,并且不认为让它如此依赖于您的控制器层是一个好策略。
在“Programming Microsoft ASP.NET MVC”中,Dino Esposito 推荐了一种他称之为“IPODD”的模式。我对 MVC 的经验很少,但如果你能掌握它,这一章值得一读。我想说它为您的问题提供了经验丰富的见解。
您可以在此处预览本书对 iPODD 模式的解释。