【问题标题】:breeze merge server entities微风合并服务器实体
【发布时间】:2014-01-15 07:41:30
【问题描述】:

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

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

我试图在微风(实体管理器?)中的某处找到一种方法,如果我传递从服务器检索到的实体列表,这些实体将用于更新本地缓存,但我没有找到任何方法。研究了源码后,在微风库中做了一些改动,这里暴露了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;
}

注意: 转换用于绕过 Typescript 类型检查并使用微风内部。

这可行,但我不喜欢我必须使用微风内部,并且我必须为此目的修改库。有没有更好的方法来实现我的目标?

【问题讨论】:

  • 我有一个类似的问题,在 [this][breezejs.com/documentation/querying-depth]brew 文档页面的末尾有一小部分可能会有所帮助。但是我尝试了这种方法没有成功,因为我在合并过程中遇到了一些错误,但值得一看。

标签: typescript breeze


【解决方案1】:

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

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

【讨论】:

  • 这是真的,但是我有一个真正的 Breeze 实体列表,我想使用 WebApi Json 适配器将其导入客户端缓存,并使用微风拥有的所有功能。正如我所看到的,合并根本不是微不足道的,所以为什么不使用您的实现,从我的角度来看这是安全
  • jsonResultsAdapter 不处理合并,它只是告诉 Breeze 如何将您的 json 对象转换为实体。在此步骤之后,微风提供了合并。而且实现一个 jsonResultsAdapter 并不难。看源码,大部分适配器不到30行代码。
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 2014-11-02
  • 2013-04-05
  • 2014-04-08
相关资源
最近更新 更多