Architecture 我可以从表示层访问存储库吗?

Architecture 我可以从表示层访问存储库吗?,architecture,domain-driven-design,repository-pattern,presentation,Architecture,Domain Driven Design,Repository Pattern,Presentation,我从DDD开始。我对DDD应用程序中涉及的几个层之间的交互有点困惑 我可以从表示层调用我的存储库吗?如果没有,我就必须复制我的服务层中存储库提供的CRUD功能(当然,谁会反过来使用存储库来实现这些功能)?做这件事的最佳方法是什么?我通常使用服务层,但使用存储库没有坏处当然,您可以从表示层调用存储库。我的一条建议是让您的表示层依赖于存储库的抽象,而不是实现,即UserSession依赖于IPersonRepository接口,而不是PersonRepository类。它不仅可以很好地分离关注点,而

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


我可以从表示层调用我的存储库吗?如果没有,我就必须复制我的服务层中存储库提供的CRUD功能(当然,谁会反过来使用存储库来实现这些功能)?做这件事的最佳方法是什么?

我通常使用服务层,但使用存储库没有坏处

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


加油

表示层的确切含义是什么? 如果你指的是控制者/演示者,那就很好了。我使用的经验法则是,如果控制器操作是4行或更多代码,我应该考虑重构到一个应用程序服务类,但两者都在应用程序级别,您当然可以在那里使用存储库


你表达问题的方式——我肯定会误解这一点——听起来很可疑,好像你想从你的观点或代码背后引用存储库。如果是那样的话,我会说不!不不

正如凯文所说,与主持人或主持人合作会给你带来很多好处

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

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

您只需将页面契约设计为具有web表单的具体实现的接口,然后在测试演示者时只需存根/模拟这些接口


我想到的唯一缺点是,最终得到的代码比“传统”web表单解决方案中的代码要多。

我要补充的是,这也使得注入依赖项变得容易,并使用像Ninject这样的IoC框架,这反过来又使编写测试变得容易。我在问题中没有说清楚,但在本例中,我指的是ASP.NET页面中的代码作为表示层。你还会说(当然是通过一个界面)调用存储库是可以的吗?@Ali:我的建议是选择一种适合你需要的表示模式。使用控制器或演示者,您永远不需要直接从代码隐藏中调用存储库。Dino Esposito在MSDN杂志上发表了一篇关于ASP.NET表示模式的文章。()在Web表单中使用MVP模式可能会使您受益匪浅。祝你好运是的,就是这样。我说的是从我的代码中引用它然后是的,那很糟糕。代码隐藏不是表示层,代码隐藏实际上是视图的一部分。在标准的web术语中,代码隐藏应该以与查看非常简单的javascript相同的方式进行查看。将任何逻辑移动到Controller或Presenter类中,并通过构造函数将您的职责注入其中。因此,澄清一下,您所说的是错误的,因为您在视图层而不是表示层中引用了存储库