1

我创建了一个数据库(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)

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

4

3 回答 3

4

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

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

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

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

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

HTH,马克

于 2012-06-28T21:32:38.327 回答
1

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

  1. 来自 msdn http://msdn.microsoft.com/en-us/library/cc668796的快速入门教程
  2. 将数据公开为服务。http://msdn.microsoft.com/en-us/library/dd728286
于 2012-06-28T15:20:55.743 回答
0

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

于 2019-09-30T13:49:11.863 回答