【发布时间】:2015-05-22 16:59:15
【问题描述】:
我在许多项目中使用 BreezeJS 已经有一段时间了,我不得不说,在大多数情况下,它让你的生活更轻松,这就是我不断回归的原因。但是,我似乎一直遇到一种情况,它完全没有问题,而且我似乎找不到任何“正确”的方法来解决这个问题。
让我解释一下。 BreezeJS 的一大优点是它遵循这种 UoW 模式,允许您使用实体管理器的 saveChanges 方法(如 EF)保存实体。
但这也是问题的一部分,因为随着您开发越来越复杂的应用程序,我有时会觉得这种方法并不总是合适的。我发现我经常有:
- 实际上并不涉及在客户端上创建实体,而是涉及在 Web api 上执行可能导致在服务器上创建各种实体或其他形式的状态的操作,然后应将其发回给客户。
- 涉及具有属性的实体的操作,由于其中一些是服务器私有的,因此无法保存,并且不应放在客户端上(通常使用客户端的 JsonIgnore 解决,但在开始持久化时会出现问题再次给定实体)
我觉得有一个东西可以比较容易地解决这些问题,而且是OData中已经存在的一个概念:Actions。可以在全局、实体集或特定实体上执行的操作,然后返回将由 BreezeJS 直接跟踪的自定义对象或实体。
目前,我发现自己正在执行以下解决方法(我不知道是否合适):
- 在 BreezeController 上创建一个“资源”动作,它代表一个动作而不是一个实际的资源。这接受一个自定义参数对象并返回一个非实体对象,该对象可能包含实际实体(如“Cool Breezes”中的查找所述,因为这些将由 BreezeJS 跟踪)
- 使用“ajaxpost”微风实验室允许使用 POST 而不是 GET 查询资源,因此可以传入任何类型的参数。
有没有更合适的方法来完成这样的事情?是否有未来计划支持自定义操作?
我见过的解决此类操作的一种方法是简单地“围绕”微风 api 控制器进行此类操作。也就是简单的使用一个与微风无关的ApiController。但是我觉得这有悖于微风的目的,因为如果操作导致创建或删除实体,您必须在客户端上自己开始跟踪它们,或者在本地创建它们,或者通过发出另一个微风查询到去拿他们。如果您需要大量此类操作,这真的很烦人。
【问题讨论】:
-
我自己也在为同样的问题苦苦挣扎。
标签: c# entity-framework breeze