Эффективно то, что происходит:
1) ViewModel предоставляется экземпляр для IServiceAgent
2) ViewModel собирается получать и отправлять данные с помощью IServiceAgent. Модель представления не знает, как получить данные, но сообщает сервисному агенту, чтобы получить их.
3) IServiceAgent не должен знать о ViewModel или о том, как его назначить.
Здесь задается вопрос. Что делает делегат и зачем он нужен (s, e).
The (s,e) => {} is effectively a way of saying this:
void anonymousMethod(Object s, EventArgs e){};
Почему это сделано?
Ответ в том, что вы хотите, чтобы IServiceAgent обновлял viewModel, но не имел ссылки на ViewModel. Как это можно сделать. Ну, это можно сделать с помощью обычного метода с типом возврата. Но в этом случае пример статьи, которую вы использовали, хочет вернуть его значение асинхронно. Это может быть сделано традиционным методом, но это заблокирует вашу модель представления. По сути, то, что вы реализуете, является похожим событием. Делегат - это контракт на мероприятие. Таким образом, тот, кто реализует событие, должен соответствовать контракту, который предоставляет делегат, например:
textbox.Click += (s,e) => {((TextBox)s).Text = "Ive been clicked!"};
-ИЛИ-
textbox.Click += new ClickHandler(myClickHandler);
void myClickHandler(Object sender, EventArgs args){}
1018 * -ИЛИ- *
textbox.Click += myClickHandler;
void myClickHandler(Object sender, EventArgs args){}
Все они соответствуют контракту, указанному в событии щелчка (которое определяется делегатом событий).
Если вы сравните это с тем, что определено в классе текстового поля, это будет выглядеть примерно так:
Class TextBox{
event ClickEventHandler Click;
delegate ClickEventHandler (Object sender, EventArgs args);
}
Следовательно, это означает, что для реализации события щелчка в текстовом поле необходимо предоставить метод, который имеет два входа Object sender, EventArgs a и имеет тип возврата void. Этот метод может иметь любое имя.
Лямбды, используемые в вашем вопросе, являются delgates. Делегаты используются для установления методов контрактов. Ваша лямбда соблюдает договор, поэтому он действует. Что (s, e) означает, зависит от делегата контракта, который вы соблюдаете:
EventHandler<GetPeopleCompletedEventArgs> callback
, который, я верю, будет генерировать что-то вроде:
(Object Sender, GetPeopleCompletedEventArgs args) <-------> (s,e)
Может показаться немного сумасшедшим, чтобы понять, почему так сложно увидеть, что такое s и e, но intellisense должен (у меня работает с resharper) показывать типы s, e. Синтаксис (s, e) очень распространен, и первый почти всегда будет таким же, как и события .net (Object, EventArgs)