Вызов служб WCF в MVVM?

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

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

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

person lostinwpf    schedule 13.11.2011    source источник


Ответы (1)


Я предлагаю создать объект / компонент поиска как объект прокси для службы 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 сущности - определенно хорошая идея.

person k.m    schedule 13.11.2011