2014-01-15 2 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; 
} 

Примечания: в < любых > преобразовании, используемые в обходе Типовой тип проверки и использование внутренних деталей бриза.

Это работает, однако мне не нравится, что я должен использовать внутренние элементы Breeze и что мне нужно изменить библиотеку для этой цели. Есть ли лучший способ достичь моей цели?

+0

У меня есть аналогичная проблема, есть небольшая часть в конце [this] [http://www.breezejs.com/documentation/querying-depth] страницы документации breeze, которая может помочь. Однако я пробовал этот подход неудачно, потому что я получил некоторые ошибки в процессе слияния, но стоит посмотреть. – 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 строк кода. –

Смежные вопросы