【问题标题】:How can I query cross tables with Repository Pattern?如何使用存储库模式查询交叉表?
【发布时间】:2012-05-04 13:05:52
【问题描述】:

在我的 asp.net mvc 3 应用程序中,我使用的是存储库模式。 我有 3 个实体,公司、国家、城市。他们每个人都有自己的存储库。公司实体有FfoundedCountry 和FundedCity 外键。 现在在视图中,我想显示公司详细信息。在此视图中,我想查看公司详细信息以及FfoundedCountry 名称和FfoundedCity 名称。在我看来,我必须使用一种 JOIN 查询来处理这个问题。但我被困在如何在存储库模式中实现这一点。如何在存储库模式中处理此 JOIN?

谢谢。

【问题讨论】:

    标签: asp.net-mvc join repository-pattern


    【解决方案1】:

    不要以阻止连接的方式构建您的存储库模式!这通常意味着对与当前 HTTP 请求关联的所有实例使用相同的 ORM 上下文(DataContext/ObjectContext)。

    我认为拥有一个通用的 IRepository 是一种反模式,因为数据库访问很少会同时受限于单一类型的实体。

    您可以将 DataContext/ObjectContext 本身视为一个存储库。

    最后一条建议:如果您不知道存储库抽象有什么用处,请不要使用。

    【讨论】:

    • 我不同意一件事:数据上下文应被视为存储库。虽然 DC 抽象了 db 访问和 sql,但它仍然与 rdbms 和 IMO 捆绑在一起,它充其量只是一个泄漏的抽象。
    • 如果 ORM 是一个泄漏抽象,那么自定义存储库有多泄漏?这是一个筛子。同时,它阻止您访问 ORM 的全部功能(这是抽象的本质)。
    • 正确设计的存储库不会泄漏,因为它不会暴露诸如 ORM 之类的实现细节。存储库确实使用了 ORM 的全部功能,这是它的工作,而不是应用程序其余部分的工作来了解或使用 orm。请看这个帖子sapiensworks.com/blog/post/2012/04/15/…
    【解决方案2】:

    存储库应该有一个基于任务的界面。这意味着 ORM、连接等都在存储库中。该应用程序只看到一个接口,该接口返回一个它可以使用的对象。

    这意味着您不会围绕表格创建存储库(它几乎没有达到目的)。在您的场景中,我建议您(至少)有 2 个存储库:一个将处理与更新模型相关的所有内容,另一个将仅提供读取(查询)。

    这意味着查询存储库将只返回您想要的数据(它基本上返回视图模型位)。当然,实际的表和连接是存储库的实现细节。

    【讨论】:

    • “这意味着您不会围绕表创建存储库(它几乎没有达到目的)。”据我所知,我必须为每个实体创建一个存储库。根据您的评论,我认为我必须添加另一个可以处理复杂查询的存储库。对吗?
    • 否 :) 。您不必“必须”为每个实体创建存储库。存储库基本上隐藏了与应用程序其余部分相关的所有数据库。在存储库中,您可能会使用实体、EF 或 Nhibernate,这无关紧要。存储库在内部使用 orm,在您的情况下是实体,然后返回应用程序理解的对象。实体本身已经是存储库使用的抽象。
    • 在下面的教程中它说“在本教程中,您将为每个实体类型实现一个存储库类。”我跟着它。 asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/…
    • 是的,那个 EF 教程在模式方面是错误的(我也看到了其他一些尴尬的决定)。它的目的是推送 EF,而不是教你存储库模式。很多时候,存储库的使用是相当人为的。存储库是一个非常好的模式,我在每个项目中都使用它,但不是这样。还要注意通用存储库,它具有非常具体的适用性,尽管在大多数情况下是一种反模式。我也会在那里发表一些建设性的批评。
    • 谢谢迈克。你启发了我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2011-03-01
    • 2014-10-23
    相关资源
    最近更新 更多