2014-01-15 119 views
1

這裏是我的問題的主要支柱:微風合併服務器實體

  • 我已經實現了HTTP請求 - 響應服務層。 是一個請求(對象)被髮送到服務器,在那裏它被處理,然後 然後一個響應被髮送到客戶端(TypeScript/JavaScript)。
  • 請求對象和響應對象都可能包含微風 實體。
  • 在收到服務器的響應後,如果有 也包含在響應中的微風實體,我需要更新 客戶端緩存(實體管理器)。
  • 負責處理 請求的控制器被標記爲[BreezeController],所以實體 就像微風期望的那樣。請求和響應 本身不是輕而易舉的實體。

我試圖在微風的某處找到一個方法(實體管理器?),在那裏,如果我通過從服務器獲取實體的名單,這些被用來更新本地緩存,但我沒有發現任何。研究源代碼後,我確實在微風圖書館,在那裏我露出MappingContext內部類,並做了以下(打字稿代碼)的一些變化:

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; 
} 

注:<任何>轉換來繞過打字稿類型檢查和使用微風內部。

這個工程,但我不喜歡,我不得不使用微風內部,我必須修改庫用於此目的。有沒有更好的方法來實現我的目標?

+0

我有一個類似的問題,在[this] [bb]文檔頁面末尾有一小段可能有幫助。但是,我嘗試了這種方法失敗,因爲我在合併過程中遇到了一些錯誤,但值得一看。 – Ariel

回答

0

我不能完全肯定我理解的問題,但看看在JsonResultsAdapter的討論:http://www.breezejs.com/documentation/web-service-data-mapping

的想法是,一個JsonResultAdapter可以在客戶端上使用強迫任何JSON數據成將合併到EntityManager的實體。

+0

這是真的,但是我有一個真正的Breeze實體列表,我希望使用WebApi Json適配器在客戶端緩存中導入並使用微風所具有的所有功能。正如我所看到的,合併不是微不足道的,所以爲什麼不使用你的實現,從我的角度來看這是安全的。 – ioan

+0

jsonResultsAdapter不處理合並,它只是告訴Breeze如何將您的json對象轉換爲實體。在此步驟之後,由微風提供合併。實現jsonResultsAdapter並不困難。看看源代碼,大多數適配器將少於30行代碼。 –