Вот основные столпы моей проблемы:бриз слияния серверов объекты
- Я внедрившие сервисный слой запроса-ответа по протоколу 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;
}
Примечания: в < любых > преобразовании, используемые в обходе Типовой тип проверки и использование внутренних деталей бриза.
Это работает, однако мне не нравится, что я должен использовать внутренние элементы Breeze и что мне нужно изменить библиотеку для этой цели. Есть ли лучший способ достичь моей цели?
У меня есть аналогичная проблема, есть небольшая часть в конце [this] [http://www.breezejs.com/documentation/querying-depth] страницы документации breeze, которая может помочь. Однако я пробовал этот подход неудачно, потому что я получил некоторые ошибки в процессе слияния, но стоит посмотреть. – Ariel