【发布时间】: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;
}
注意:
这可行,但我不喜欢我必须使用微风内部,并且我必须为此目的修改库。有没有更好的方法来实现我的目标?
【问题讨论】:
-
我有一个类似的问题,在 [this][breezejs.com/documentation/querying-depth]brew 文档页面的末尾有一小部分可能会有所帮助。但是我尝试了这种方法没有成功,因为我在合并过程中遇到了一些错误,但值得一看。
标签: typescript breeze