TL; DR: Каков хороший и проверяемый способ реализовать зависимость между ViewModels и службами WCF в клиенте MVVM?
Прочтите оставшуюся часть вопроса, чтобы узнать больше о проблемах, с которыми я столкнулся при попытке сделать это:
Я работаю над клиентом silverlight, который подключается к службе wcf, и я хочу написать модульные тесты для клиента. Итак, я ищу хорошее решение для использования клиентов wcf в моих ViewModels и тестирования этого взаимодействия. До сих пор я нашел два решения:
Решение 1. Вот как я реализовал это до сих пор:
public class ViewModelExample
{
public ViewModelExample(IServiceClient client)
{
client.DoWorkCompleted += ..
client.DoWorkAsync();
}
}
//This is how the interface looks like
public interface IServiceClient
{
event EventHandler<AsyncCompletedEventArgs> DoWorkCompleted;
void DoWorkAsync();
}
//I was able to put the interface on the generated clients because they are partial classes, like this:
public partial class GeneratedServiceClient : IServiceClient
{
}
Хорошая сторона: сравнительно легко высмеять
Плохая часть: мой клиент службы живет столько же, сколько моя ViewModel, и когда у меня есть параллельные запросы, я не знаю, какой ответ принадлежит какому запросу.
Решение 2. На основе этого ответа Срок службы клиента службы WCF.
public class ViewModelExample
{
public ViewModelExample(IServiceFactory factory)
{
var client = factory.CreateClient();
client.DoWorkCompleted += ...
client.DoWorkAsync();
}
}
Хорошая сторона: каждый запрос поступает от другого клиента, поэтому больше нет проблем с сопоставлением запросов с ответами.
Плохая часть: труднее тестировать. Мне каждый раз приходилось писать макеты как для фабрики, так и для клиента wcf. Я не хотел бы этого делать, так как у меня уже 200 тестов ... :(
У меня вопрос, как вы, ребята, это делаете? Как ваши ViewModels взаимодействуют со службами wcf, куда вы вводите зависимость и как вы тестируете это взаимодействие? Я чувствую, что что-то упускаю ..