【问题标题】:MVC Service Layer - Service per Controller or other design?MVC 服务层 - 每个控制器的服务或其他设计?
【发布时间】:2013-07-12 12:43:34
【问题描述】:

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

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

有没有更好的方法来构建这个?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        您可以预览本书对 iPODD 模式的解释here

        【讨论】:

        • 或许您可以告诉我们 IPODD 是什么意思,或者提供比“阅读本书”更多的信息
        • 不,我不能,因为它只在书中,我手头没有。他没有写博客或发布过它,所以那里几乎没有其他内容。 Stackoverflow 现在是关于用勺子喂食,还是要稍微了解一下访问可能帮助某人自己找到答案的信息?
        • Stackoverflow 是关于直接回答问题的。你的回答没有做到这一点。我建议删除它并将其重新发布为评论,而不是答案。这更适合本网站的格式。
        • '任何让提问者朝着正确方向前进的答案都是有帮助的......'
        • iPODD = 惯用表示、编排、域和数据模式
        猜你喜欢
        • 1970-01-01
        • 2012-01-10
        • 2014-02-19
        • 2012-03-09
        • 1970-01-01
        • 2012-11-08
        • 2023-02-22
        • 2015-09-19
        • 2012-06-01
        相关资源
        最近更新 更多