我创建了一个数据库(SQL Server 2008 Express),并使用Visual Studio 2010中的OR Designer在顶部创建了一些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>
然后我需要让我的Repository实现IUpdatable,避免调用我现有的更新方法(例如CreateUserWithDefaultType)
我在这里缺少什么?有没有一个很好的例子说明如何做到这一点,暴露存储库层而不是实体层?
答案 0 :(得分:4)
我认为@Bull在这里走在正确的轨道上,但想要更多地建立一个答案。
正如他所说,OData主要用于实体,而不是预定义的方法。例如,要实现第一个示例,您只需要公开一个IQueryable of User,这将允许任何OData客户端形成http://yourdomain/Users?$filter=UserType eq Administrator
等URL。如果您使用的是WCF数据服务客户端,则可以使用LINQ提供程序来执行context.Users.Where(u => u.UserType == "Administrator")
之类的操作。 (另请注意,WCF数据服务目前不支持我们的服务模型中的枚举。)
类似地,第二种方法通常只是http://yourdomain/Users
的POST(我们在第一个示例中看到的与用户相同的IQueryable),您可以在模型或数据库中设置默认类型。
如果您确实想要使用您的存储库,那么您可能最好处理完整的自定义数据服务提供商,如Alex的博客中所述:http://blogs.msdn.com/b/alexj/archive/2010/01/07/data-service-providers-getting-started.aspx
最后一点 - 我们希望在不久的将来让我们的供应商公开;这将大大简化你在这里想要实现的目标。我们将此帖作为该特定功能重要性的另一个重新计数。 :)
HTH, 标记
答案 1 :(得分:1)
我认为你错过了这张照片。 OData将您的实体公开为Feed。 Odata也称为WCF数据服务,正确的地方是获取ODATA / WCF数据服务的基本图片:
答案 2 :(得分:0)
当需要从db中大量下载数据,然后为所有其他普通表使用OData v3端点时,我最终将两个WebApi 2端点用于所有存储过程和函数的自定义api调用,因此我不必担心发送的过滤和查询参数通过api调用。