【发布时间】:2010-11-26 13:39:00
【问题描述】:
我从 DDD 开始。我对 DDD 应用程序中涉及的多个层之间的交互有点困惑。
我可以从我的表示层调用我的存储库吗?如果不是,我是否必须在我的服务层中复制存储库提供的 CRUD 功能(这当然会反过来使用这些功能的存储库)?最好的方法是什么?
【问题讨论】:
标签: architecture domain-driven-design repository-pattern presentation
我从 DDD 开始。我对 DDD 应用程序中涉及的多个层之间的交互有点困惑。
我可以从我的表示层调用我的存储库吗?如果不是,我是否必须在我的服务层中复制存储库提供的 CRUD 功能(这当然会反过来使用这些功能的存储库)?最好的方法是什么?
【问题讨论】:
标签: architecture domain-driven-design repository-pattern presentation
您所说的表示层究竟是什么意思? 如果您的意思是控制器/演示者,那很好。我使用的经验法则是,如果控制器操作是 4 行或更多代码,我应该考虑重构为应用程序服务类,但仍然 - 两者都在应用程序级别,您当然可以在那里使用存储库。
您提出问题的方式(我当然可能会误解)听起来很可疑,就像您正在考虑从您的视图或代码隐藏中引用存储库一样。在那种情况下,我会说不!不!不!
【讨论】:
当然,您可以从表示层调用存储库。我的一条建议是让您的表示层依赖于存储库的抽象而不是实现,即 UserSession 依赖于 IPersonRepository 接口而不是 PersonRepository 类。它不仅可以很好地分离关注点,而且可以使测试更容易。
加油!
【讨论】:
好吧,我通常使用服务层,但使用您的存储库没有害处
【讨论】:
正如 Kevin 所说,与控制器或演示者一起使用会给您带来很多好处。
这些包括明确的关注点分离以及可测试性。
就个人而言,在 ASP.NET 设置中,我会选择“被动视图”Fowler。
您只需将页面契约设计为具有 Web 表单的具体实现的接口,然后在测试您的演示者时对它们进行存根/模拟。
唯一想到的缺点是,与“传统”网络表单解决方案相比,您最终会得到更多代码。
【讨论】: