Я работаю над настольным приложением Prism и хотел бы узнать, как лучше всего работать со списками справочных / справочных данных при использовании серверной части WCF. Я думаю, что этот вопрос может охватывать несколько областей, и я был бы признателен за некоторые рекомендации
Например, рассмотрим поиск, содержащий продукты (коды и описания), которые будут использоваться во множестве различных экранов ввода в системе.
- Модель просмотра вызывает службу WCF напрямую для получения данных для заполнения элемента управления?
- Можете ли вы создать элемент управления, который имеет дело исключительно с продуктами со своей собственной моделью просмотра и т. Д., А затем использовать его в каждом месте, где требуется поиск продукта, или вы бы повторно реализовали, скажем, поле со списком, которое повторно заполняет элементы ItemsSource продуктов в каждой отдельной модели представления формы, которая его использует ?
- Могу ли я создать совершенно новую службу WCF, названную чем-то вроде службы LookupData, и использовать ее для заполнения моих списков поиска? - Я обеспокоен тем, что у меня будет много запросов, если я это сделаю.
- Какие еще есть подходы к этому?
Ответ 1 · рейтинг 2 · k.m
Я предлагаю создать объект / компонент поиска как объект прокси для службы WCF. Это может работать по-разному, но мне на ум приходит самый простой:
- Внедрить службу WCF с методами для предоставления всех
Products сущностей и запрошенных (например, на основе кода продукта)
- Реализуйте компонент, который будет использовать клиент WCF для получения продуктов, назовем его
ProductsProvider
- Ваши модели представления будут зависеть от
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 сущности - определенно хорошая идея.