【问题标题】:Can I access a repository from presentation layer?我可以从表示层访问存储库吗?
【发布时间】:2010-11-26 13:39:00
【问题描述】:

我从 DDD 开始。我对 DDD 应用程序中涉及的多个层之间的交互有点困惑。

我可以从我的表示层调用我的存储库吗?如果不是,我是否必须在我的服务层中复制存储库提供的 CRUD 功能(这当然会反过来使用这些功能的存储库)?最好的方法是什么?

【问题讨论】:

    标签: architecture domain-driven-design repository-pattern presentation


    【解决方案1】:

    您所说的表示层究竟是什么意思? 如果您的意思是控制器/演示者,那很好。我使用的经验法则是,如果控制器操作是 4 行或更多代码,我应该考虑重构为应用程序服务类,但仍然 - 两者都在应用程序级别,您当然可以在那里使用存储库。

    您提出问题的方式(我当然可能会误解)听起来很可疑,就像您正在考虑从您的视图或代码隐藏中引用存储库一样。在那种情况下,我会说不!不!不!

    【讨论】:

    • 是的。我说的是从我的代码隐藏中引用它
    • 好吧,是的,那很糟糕。代码隐藏不是表示层,代码隐藏实际上是您视图的一部分。在标准的 Web 术语中,应该以与查看非常简单的 javascript 相同的方式查看代码隐藏。将任何逻辑移动到 Controller 或 Presenter 类中,并通过构造函数将您的存储库注入其中。
    • 所以澄清一下 - 你说的是不好的,因为你在视图层引用存储库,而不是表示层
    【解决方案2】:

    当然,您可以从表示层调用存储库。我的一条建议是让您的表示层依赖于存储库的抽象而不是实现,即 UserSession 依赖于 IPersonRepository 接口而不是 PersonRepository 类。它不仅可以很好地分离关注点,而且可以使测试更容易。

    加油!

    【讨论】:

    • 我要补充一点,这也使得注入依赖项变得容易,并使用像 Ninject 这样的 IoC 框架,这反过来又使编写测试变得容易。
    • 我没有在我的问题中说清楚,但在这种情况下,我指的是 ASP.NET 页面中的代码作为表示层。你还会说可以调用存储库(即通过当然的界面)吗?
    • @Ali:我的建议是选择适合您需求的演示模式。使用控制器或演示者,您永远不需要直接从代码隐藏中调用存储库。 Dino Esposito 有一篇关于 ASP.NET 表示模式的精彩 MSDN 杂志文章。 (msdn.microsoft.com/en-us/magazine/dd252940.aspx) 将 MVP 模式与 Web 表单结合使用可能会使您受益最大。祝你好运!
    【解决方案3】:

    好吧,我通常使用服务层,但使用您的存储库没有害处

    【讨论】:

      【解决方案4】:

      正如 Kevin 所说,与控制器或演示者一起使用会给您带来很多好处。

      这些包括明确的关注点分离以及可测试性。

      就个人而言,在 ASP.NET 设置中,我会选择“被动视图”Fowler

      您只需将页面契约设计为具有 Web 表单的具体实现的接口,然后在测试您的演示者时对它们进行存根/模拟。

      唯一想到的缺点是,与“传统”网络表单解决方案相比,您最终会得到更多代码。

      【讨论】:

        猜你喜欢
        • 2010-10-24
        • 2015-01-11
        • 2016-09-06
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多