代码之家  ›  专栏  ›  技术社区  ›  Mirko Lugano

仅将更改的财产发送到Breeze的SaveChanges()方法

  •  1
  • Mirko Lugano  · 技术社区  · 11 年前

    在Breezejs中保存更改时,因为我有很多字段的实体,所以我想发送到服务器(到Breeze SaveChanges()方法),而不是整个实体,而是实体的子集,其中只包含已更改的财产。我知道这就是实体内部的OriginalValuesMap属性的作用,它只是为了减少网络流量以提高性能(尽管这可能是一个很小的改进)。在官方网站上 Breezejs' website 我在网上也找不到关于这个的任何信息。Thanx公司

    2 回复  |  直到 11 年前
        1
  •  3
  •   user3380160    11 年前

    出于不同的原因,我们遇到了类似的要求。我们应用程序的一部分与第三方API接口,该API坚持put的增量(无论出于何种原因,放置完整的实体都会导致服务器错误或严重的性能问题)。

    我们最终推出了一个新的数据服务适配器来解决这个问题,这是一个相对轻松的过程。我们直接扩展了基础AbstractDataServiceAdapter,但您可以在您使用的任何具体数据服务适配器之上使用自定义的_prepareSaveBundle。

    您只需注册自定义适配器:

    ctor = ->
      @name = 'custom_ds'
    ctor.prototype = new breeze.AbstractDataServiceAdapter() # or whatever your base is
    ctor.prototype._prepareSaveBundle = (saveContext, saveBundle) ->
      # Do whatever your base implementation does, but use helper.unwrapChangedValues
      # instead of helper.unwrapInstance to get at the delta
    breeze.config.registerAdapter 'dataService', ctor
    

    然后将实体管理器绑定到使用它的数据服务:

    breeze.config.initializeAdapterInstance 'dataService', 'custom_ds'
    ds = new breeze.DataService
      adapterName: 'custom_ds'
      # plus whatever other properties you need to init
    manager = new breeze.EntityManager
      dataService: ds
      # plus whatever other properties you need to init
    

    但如果你只是为了缩小有效载荷而这样做,那么这可能不值得为杰伊·特拉班德(Jay Traband)提出的所有原因而麻烦和增加脆性。

        2
  •  1
  •   Jay Traband    11 年前

    我们故意决定不这样做,因为我们觉得性能改进不值得额外的复杂性。我们是基于几个考虑做出这个决定的。

    • 它只对修改和删除有用,添加仍然需要携带每个字段。
    • 在大多数应用程序中,保存有效载荷往往比查询有效载荷小得多。
    • 标准的HTTP压缩使得这些有效载荷中最大的有效载荷也小得多。

    多年来,我们一直在一系列技术上构建RIA应用程序,根据我们的经验,优化节省负载很少能提高应用程序的整体性能。

    但是请随时将此请求添加到Breeze用户语音。与其他用户一样,如果我们有足够多的用户认为这很重要,那么我们会这样做。