breeze合并服务器实体

时间:2014-01-15 07:41:31

标签: typescript breeze

以下是我问题的主要支柱:

  • 我在http上实现了一个请求 - 响应服务层。那 是一个请求(对象)被发送到服务器,它被处理,和 然后将响应发送到客户端(TypeScript / javascript)。
  • 请求对象和响应对象都可能包含微风 实体。
  • 收到服务器的响应后,如果有 还包含响应中的breeze实体,我需要更新 客户端缓存(实体管理器)。
  • 控制器负责人 请求处理标有[BreezeController],所以实体 就像微风期待它们一样。请求和回复 本身并不是轻而易举的实体。

我试图在breeze中找到一个方法(实体管理器?),其中,如果我传递从服务器检索的实体列表,这些用于更新本地缓存,但我没有找到任何。在研究了源代码之后,我在breeze库中做了一些更改,在那里我公开了MappingContext内部类并执行了以下操作(TypeScript代码):

public processEntityRequestAsync<TResponse>(request: requestModel.RequestBase): Q.Promise<TResponse> {
  var promise = this.requestProcessor.processRequest<TResponse>(request);
  var processedPromise = promise.then(r => {
    // TODO everything in this method is a hack using internal things from breeze
    // to update the entities after getting them from server
    var updatedEntities = <any[]>(<any>r).UpdatedEntities;
    if (updatedEntities) {
      var dataService = <breeze.DataService>(<any>breeze.DataService).resolve([{
        serviceName: this.manager.dataService.serviceName,
        adapterName: "WebApi",
      }]);
      var mappingContext = new (<any>breeze).MappingContext({
        query: null, // tells visitAndMerge that this is a save instead of a query
        entityManager: this.manager,
        mergeOptions: { mergeStrategy: breeze.MergeStrategy.OverwriteChanges },
        dataService: dataService,
      });

      // Note that the visitAndMerge operation has been optimized so that we do not actually perform a merge if the 
      // the save operation did not actually return the entity - i.e. during OData and Mongo updates and deletes.
      updatedEntities = mappingContext.visitAndMerge(updatedEntities, { nodeType: "root" });
    }
    return r;
  });
  return processedPromise;
}

注意:&lt; any&gt;转换用于绕过Typescript类型检查并使用breeze内部。

这是有效的,但是我不喜欢我必须使用breeze internals并且我必须为此目的修改库。有没有更好的方法来实现我的目标?

1 个答案:

答案 0 :(得分:0)

我不完全确定我理解这个问题,但请看一下JsonResultsAdapter的讨论:http://www.breezejs.com/documentation/web-service-data-mapping

我们的想法是可以在客户端上使用 JsonResultAdapter 将任何json数据强制转换为将合并到 EntityManager 中的实体。