【问题标题】:Using OData with the Repository Pattern将 OData 与存储库模式一起使用
【发布时间】:2019-09-30 21:49:11
【问题描述】:

我创建了一个数据库(SQL Server 2008 Express),并在 Visual Studio 2010 中使用 OR 设计器在顶部创建了一些 LINQ to SQL 实体(称为 LinqEntitiesDataContext)。然后我创建了一个 Repository 类和关联的 IRepository 接口,包含一堆漂亮而简单的 CRUD 方法,这些方法提供对数据实体的有意义的访问。比如有一个方法:

IQueryable<User> QueryUsersByType(UserTypeEnum userType)

还有一个:

void CreateUserWithDefaultType(User user)

现在我想让这个存储库“通过网络”可用,并希望使用 WCF 数据服务 (OData) 来提供访问权限。但是我看到的每个 OData 示例最终都提供了对实体本身(例如用户实体)的直接访问,他们通过使数据上下文类实现 IUpdatable 然后创建一个引用此数据上下文类的 WCF 数据服务来做到这一点。就我而言,这意味着使 LinqEntitiesDataContext IUpdatable 并将其用作服务类型——这完全避免了使用我的 Repository 类。

我觉得我需要让数据服务公开我的存储库:

DataService<Repository>  // *Not* DataService<LinqEntitiesDataContext>

但是我需要让我的存储库实现 IUpdatable,避免调用我现有的更新方法(例如 CreateUserWithDefaultType)

我在这里缺少什么?有没有一个很好的例子来说明如何正确地做到这一点,暴露存储库层而不是实体层?

【问题讨论】:

    标签: design-patterns repository odata


    【解决方案1】:

    我认为@Bull 在这里走在正确的轨道上,但想进一步构建一个答案。

    正如他所说,OData 主要设计用于处理实体,而不是预定义的方法。例如,要实现您的第一个示例,您只需公开一个 IQueryable 用户,这将允许任何 OData 客户端形成 URL,例如 http://yourdomain/Users?$filter=UserType eq Administrator。如果您使用的是 WCF 数据服务客户端,那么有一个 LINQ 提供程序可以让您执行类似context.Users.Where(u =&gt; u.UserType == "Administrator") 的操作。 (另外,请注意 WCF 数据服务目前不支持我们的服务模型中的枚举。)

    同样,第二种方法通常只是一个 POST 到 http://yourdomain/Users(与我们在第一个示例中看到的 User 相同的 IQueryable),您可以在模型或数据库中设置默认类型。

    如果您确实想使用您的存储库,您最好按照 Alex 的博客中所述处理完整的自定义数据服务提供商:http://blogs.msdn.com/b/alexj/archive/2010/01/07/data-service-providers-getting-started.aspx

    最后一点 - 我们确实希望在不久的将来公开我们的提供商;这将大大简化您在这里尝试实现的目标。我们会将这篇文章视为该特定功能重要性的另一个参考计数。 :)

    HTH, 标记

    【讨论】:

    • 嗯,所以这意味着我不能只为我的数据模型实现一个干净整洁的接口并让服务消费者从中受益。相反,我的业务逻辑层中的每个组件都必须在实体级别工作,应用过滤器,扩展外键,实现分页等。我可以使用服务操作来做我想做的事情吗,或者这最终会有点乱七八糟的?!
    • 有些你想做的事情肯定可以在服务器端完成。如果您正在使用 EF 提供程序,则分页在服务器端是微不足道的,否则也不会太难。预先应用过滤器和扩展外键是可能的,你可能需要更加努力才能到达那里。 Service Ops 可能会做任何你想做的事情,但它可能会一团糟。故事的寓意:我们需要优先考虑那些公共提供者。
    • 好的,不是我想听到的,但感谢您的反馈马克。我将继续使用 OData 作为我们架构层之间的接口,因为它在其他方面符合要求。
    【解决方案2】:

    我认为你错过了图片。 OData 可以将您的实体公开为提要。 Odata 也称为 WCF 数据服务,了解有关 ODATA/WCF 数据服务的基本信息的正确位置在这里:

    1. 来自msdnhttp://msdn.microsoft.com/en-us/library/cc668796的快速入门教程
    2. 将数据公开为服务。 http://msdn.microsoft.com/en-us/library/dd728286

    【讨论】:

    • 对这个答案进行了一些小的更正 - OData 不仅可以将实体公开为提要,但这绝对是最常见的用例。此外,WCF 数据服务是 Microsoft 对 OData(一种协议)的实现。微不足道,但 OData 正在走向标准化,而 WCF 数据服务将不会标准化。 (它只会执行一个标准。)
    【解决方案3】:

    我最终使用 WebApi 2 端点对所有存储过程和函数进行自定义 api 调用,需要时从 db 中提取大量数据,然后对所有其他普通表使用 OData v3 端点,这样我就不用担心发送的过滤和查询参数通过 api 调用。

    【讨论】:

      猜你喜欢
      • 2013-02-24
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 2014-02-03
      • 2018-08-04
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多