我有一个带有数据层(NHibernate和Repository模式),服务层和Web(MVC)层的ASP.NET MVC项目。
目前,对于Web层中的每个Controller,我在服务层中都有一个匹配的服务类。这很好,虽然服务类之间存在一些重复的接口和逻辑(多个类需要一个GetThingById()方法),而我的Home Controller使用多个服务(或者在专用的主页中会有大量的重复)控制器)。
有没有更好的方法来构建它?
答案 0 :(得分:3)
复制通常意味着重构:将重复的逻辑提取到服务中,将所有内容都解决(单一责任原则),直到不再有重复。
然后,您只需将多个服务注入控制器(就像您已经为家庭控制器所做的那样),或者您可以创建组合多个服务的类(另请参阅Delegation,Facade,{{ 3}} pattern和Decorator)并注入那些。
答案 1 :(得分:2)
没有银弹,所以你不会在这里得到“正确”的答案。这取决于您的具体情况。
我个人试图避免添加这么多层,除非非常必要,IMO,你需要非常强烈的动力来拥有如此多的抽象层,因为通常你可以用更少的组件创建一个合适的架构。
我会说,对于普通的应用程序,您甚至不需要正式的服务层,因为它最终只是一堆空方法,只是调用存储库中的另一个方法。
如果您需要使用服务层,则每个域实体或每组实体可能更适合拥有一个服务类。不要认为每个控制器都有一个服务类很有意义。如有必要,您可以添加一些辅助类来覆盖通用控制器逻辑。
我用你的方法看到的问题是你的服务层应该是模型的一部分,并且不要认为让它如此依赖你的控制器层是一个很好的策略。
答案 2 :(得分:0)
在“编程Microsoft ASP.NET MVC”中,Dino Esposito推荐了一种他称之为“IPODD”的模式。我对MVC的经验不多,但是如果能掌握它,本章值得一读。我会说它提供了一个经验丰富的洞察你的问题。
您可以预览本书有关iPODD模式here的说明。