Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 将OData与存储库模式一起使用_Design Patterns_Repository_Odata - Fatal编程技术网

Design patterns 将OData与存储库模式一起使用

Design patterns 将OData与存储库模式一起使用,design-patterns,repository,odata,Design Patterns,Repository,Odata,我已经创建了一个SQL Server 2008 Express数据库,并使用Visual Studio 2010中的OR设计器在顶部创建了一些名为LinqEntitiesDataContext的LINQ到SQL实体。然后,我创建了一个Repository类和相关的IRepository接口,其中包含了一系列漂亮而简单的CRUD方法,这些方法提供了对数据实体的有意义的访问。例如,有一种方法: IQueryable<User> QueryUsersByType(UserTypeEnum

我已经创建了一个SQL Server 2008 Express数据库,并使用Visual Studio 2010中的OR设计器在顶部创建了一些名为LinqEntitiesDataContext的LINQ到SQL实体。然后,我创建了一个Repository类和相关的IRepository接口,其中包含了一系列漂亮而简单的CRUD方法,这些方法提供了对数据实体的有意义的访问。例如,有一种方法:

IQueryable<User> QueryUsersByType(UserTypeEnum userType)
现在,我想让这个存储库跨网络可用,并希望使用WCF数据服务OData提供访问。但我看到的每个OData示例最终都提供了对实体本身的直接访问,例如用户实体,他们通过使数据上下文类实现IUpdatable,然后创建引用此数据上下文类的WCF数据服务来实现这一点。在我的例子中,这意味着使LinqEntitiesDataContext IUpdatable成为可更新的,并将其用作服务类型—这完全避免了使用我的存储库类

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

DataService<Repository>  // *Not* DataService<LinqEntitiesDataContext>
但是,我需要使我的存储库实现IUpdatable,避免调用我现有的更新方法,例如CreateUserWithDefaultType


我错过了什么?有没有一个很好的例子来说明如何正确地做到这一点,即公开存储库层而不是实体层?

我认为您没有看到这一点。OData将您的实体公开为提要。Odata也称为WCF数据服务,了解Odata/WCF数据服务基本情况的正确位置是:

msdn的快速入门教程 将数据作为服务公开。
我想你错过了这张照片。OData将您的实体公开为提要。Odata也称为WCF数据服务,了解Odata/WCF数据服务基本情况的正确位置是:

msdn的快速入门教程 将数据作为服务公开。
我认为@Bull在这方面是正确的,但我想再多构建一个答案

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

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

如果您真的想使用存储库,最好按照Alex的博客中的描述处理完整的自定义数据服务提供商:

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

嗯,,
马克

我认为@Bull在这方面走的是正确的,但我想进一步给出一个答案

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

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

如果您真的想使用存储库,最好按照Alex的博客中的描述处理完整的自定义数据服务提供商:

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

嗯,,
Mark

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

当需要从db和OData v获取大量数据时,我最终使用WebApi 2端点为所有StoredProcess和函数进行自定义api调用
所有其他普通表的3个端点,因此我不太担心通过api调用发送的过滤和查询参数

对这个答案只做了几个小的修正——OData不仅仅是将实体作为提要公开,而且这绝对是最常见的用例。此外,WCF数据服务是微软对OData a协议的实现。较小的nit,但OData正在走向标准化,而WCF数据服务将不会标准化。它只是实现了一个标准,只是对这个答案做了一些小的修正——OData不仅仅是将实体作为提要公开,而且这肯定是最常见的用例。此外,WCF数据服务是微软对OData a协议的实现。较小的nit,但OData正在走向标准化,而WCF数据服务将不会标准化。它将只实现一个标准的.Hmmm,所以这意味着我不能一次就为我的数据模型实现一个干净的接口,并让服务消费者从中受益。相反,我的业务逻辑层中的每个组件都必须在实体级别上工作,应用过滤器、扩展外键、实现分页等。我可以使用服务操作来完成我想要的任务吗,或者这会有点混乱吗?!您想做的一些事情肯定可以在服务器端完成。如果您使用EF提供程序,那么分页在服务器端是微不足道的,否则就不太难了。预应用过滤器和扩展外键是可能的,您可能需要更加努力才能达到目的。服务运营部可能可以做你想做的一切,但最终可能会搞得一团糟。这个故事的寓意是:我们需要优先考虑那些公共服务提供者。好吧,这不是我想听到的,但感谢你们的反馈。我将继续使用OData作为我们架构层之间的接口,因为它在其他方面符合要求。嗯,这意味着我不能一次就为我的数据模型实现一个干净的接口,并让服务消费者从中受益。相反,我的业务逻辑层中的每个组件都必须在实体级别上工作,应用过滤器、扩展外键、实现分页等。我可以使用服务操作来完成我想要的任务吗,或者这会有点混乱吗?!您想做的一些事情肯定可以在服务器端完成。如果您使用EF提供程序,那么分页在服务器端是微不足道的,否则就不太难了。预应用过滤器和扩展外键是可能的,您可能需要更加努力才能达到目的。服务运营部可能可以做你想做的一切,但最终可能会搞得一团糟。这个故事的寓意是:我们需要优先考虑那些公共服务提供者。好吧,这不是我想听到的,但感谢你们的反馈。我将继续使用OData作为我们架构层之间的接口,因为它在其他方面符合要求。
DataService<Repository>  // *Not* DataService<LinqEntitiesDataContext>