Вызов сервисов WCF в MVVM? - PullRequest
       3

Вызов сервисов WCF в MVVM?

2 голосов
/ 14 ноября 2011

Я работаю над настольным приложением Prism и хотел бы знать, как лучше всего справляться со списками справочных / справочных данных при использовании бэкэнда WCF.Я думаю, что этот вопрос может охватывать несколько областей, и я был бы признателен за некоторые рекомендации

Например, рассмотрим поиск, который содержит Продукты (коды и описания), которые будут использоваться на многих различных экранах ввода в системе.

  1. Вызывает ли viewmodel службу WCF напрямую, чтобы получить данные для заполнения элемента управления?
  2. Не могли бы вы создать элемент управления, который имеет дело исключительно с продуктами с его собственной моделью представления и т. Д., А затем использоватьчто в каждом месте, где требуется поиск продукта, или вы бы повторно внедрили, скажем, комбинированный список, который заполняет продукты ItemsSource в каждой модели представления формы, в которой он используется?
  3. Могу ли я создать совершенно новую службу WCF, называемую чем-то вродеСлужба LookupData и использовать это для заполнения моих списков поиска?- Я обеспокоен, что у меня будет много поисков, если я сделаю это.
  4. Какие есть другие подходы для этого?

1 Ответ

2 голосов
/ 14 ноября 2011

Я предлагаю создать ваш объект / компонент поиска в качестве прокси объекта для службы WCF.Он может работать несколькими способами, но самое простое, что приходит мне в голову:

  1. Реализация службы WCF с методами для предоставления всех Products сущностей и запрашиваемой (например,на основе кода продукта)
  2. Реализуйте компонент, который будет использовать клиент WCF для получения продуктов, назовем его ProductsProvider
  3. Ваши модели представлений будут зависеть от ProductsProvider (например, через Внедрение в конструктор )

Ключевым элементом в этой модели является ProductsProvider - он будет работать как тип кэша для Products объектов.Во-первых, он попросит веб-сервис для всех продуктов (или какой-то их части, по вашему вкусу), чтобы начать с.Затем, когда вам нужно найти продукт, вы спрашиваете поставщика - это обязанность поставщика решить, как продукт должен быть найден - может быть, он уже находится в локальном списке?Может быть, для обновления нужно будет вызвать веб-сервис?Пример:

public class ProductsProvider
{
    private IList<Product> products;
    private IProductsService serviceClient;

    public ProductsProvider(IProductsService serviceClient)
    {
        this.serviceClient = serviceClient;
        this.products = serviceClient.GetAllProducts();
    }

    public Product LookUpProduct(string code)
    {
        // 1: check if our local list contains product with given code
        // 2: if it does not, call this.serviceClient.LookUpProduct
        // 3: if service also doesn't know such product:
        //    throw, return null, report error
    }
}

Теперь, что это дает вам:

  • вам нужно всего лишь один ProductsProvider экземпляр
  • лучшая гибкость благодаря тому, когда и как называется ваш сервис
  • вашим моделям представлений вообще не придется иметь дело с WCF

Редактировать:

Что касается вашего второго вопроса.Управление может не потребоваться, но хорошая модель представления для Product сущности, безусловно, хорошая идея.

...