這裏是我的問題的主要支柱:微風合併服務器實體
- 我已經實現了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;
}
注:<任何>轉換來繞過打字稿類型檢查和使用微風內部。
這個工程,但我不喜歡,我不得不使用微風內部,我必須修改庫用於此目的。有沒有更好的方法來實現我的目標?
我有一個類似的問題,在[this] [bb]文檔頁面末尾有一小段可能有幫助。但是,我嘗試了這種方法失敗,因爲我在合併過程中遇到了一些錯誤,但值得一看。 – Ariel