Я пишу приложение (Silverlight и WPF) с использованием шаблона MVVM и платформы Prism. В моем приложении у меня есть сетка, которая содержит список клиентов. В соответствии с этим, я различные мнения, которые представляют детали клиента. Вся информация подается из службы WCF, которая предоставляет данные из запросов, а также обратных вызовов, которые инициируют события, когда данные были получены. Подробная информация обновляется при изменении выбранного элемента в сетке. Существует также фильтрующее представление, которое контролирует диапазон дат для подробной информации.
Мне также нужно реализовать аналогичный набор представлений, но для конкретного клиента. Представленная информация одинакова, поэтому, очевидно, было бы лучше повторно использовать те же классы вида и модели.
Моей первоначальной мыслью было создание отдельной промежуточной службы, которая находилась между моделями и службой WCF для обоих сценариев. Затем я бы связал модели с конкретной службой, зарегистрировав экземпляры по имени.
К сожалению, это означало бы, что мне пришлось бы самому создавать множество классов вместо того, чтобы полагаться на внедрение зависимостей, которое я бы предпочел.
Итак, для всех гуру MVVM, как должны быть структурированы представления, модели и сервисы, чтобы наилучшим образом использовать функции инфраструктуры Prism и способствовать повторному использованию кода?
Большое спасибо!
==== Редактировать: добавлен следующий текст и пример ====
Вот простой пример, который, я надеюсь, объясняет то, что я пытаюсь выполнить.
public class CustomerViewModel : ICustomerViewModel
{
public ICustomerView View { get; private set; }
private readonly ICustomerService customerService { get; set; }
private Customer customer;
public CustomerViewModel(ICustomerView view, ICustomerService service, IEventAggregator eventAggregator)
{
customerService = service;
eventAggregator.GetEvent<SelectedCustomerChangedEvent>().Subscribe(CustomerChanged);
eventAggregator.GetEvent<CustomerInfoUpdatedEvent>().Subscribe(CustomerUpdated);
View = view;
View.Model = this;
}
public string Name
{
get
{
return customer.Name;
}
}
public string Email
{
get
{
return customer.Email;
}
}
public void CustomerChanged(int customerId)
{
customerService.RequestCustomerInfo(customerId);
}
public void CustomerUpdated(Customer customer)
{
this.customer = customer;
}
}
Эта модель представления клиентов основана на текущем дизайне, где клиенты находятся в сетке. При выборе клиента запускается SelectedCustomerChangedEvent, в результате чего модель представления запрашивает информацию.
Он подается из базовой службы WCF, которая использует механизм обратного вызова для предоставления данных (получение или вычисление данных может занять много времени, поэтому простой вызов WCF не будет работать). Это работает просто отлично. Проблема заключается в том, что я хочу повторно использовать этот же вид и модель в другой области приложения, которая отображает информацию о конкретном клиенте вместо текущего выбранного клиента.
Моей первоначальной мыслью было создание промежуточного сервиса, который обрабатывал бы SelectedCustomerChangedEvent для списка и подобное событие, когда открывается специфичное для клиента представление. Затем он предоставит данные для модели через тот же CustomerInfoUpdatedEvent.
Проблема состоит в том, что, поскольку у меня теперь есть 2 службы, которые реализуют один и тот же интерфейс, мне нужно было бы назвать их, а затем заставить модель представления каким-то образом узнать, какую из них извлечь из контейнера.
Я знаю, что, вероятно, допустил ошибку проектирования. Хорошей новостью является то, что у меня есть время, чтобы исправить это, но я не уверен, как это исправить.