Книга: ASP.NET MVC Framework
Паттерн Delegate
Паттерн Delegate
Этот паттерн похож на паттерн Event
с одним существенным отличием: отсутствует метод xxxComplete
. Вместо этого метод xxx
сам занимается возвращением результата ActionResult
на основании данных, полученных от асинхронных операций. Так выглядит определение метода действия при использовании паттерна Delegate
:
public Func<ActionResult> Foo(Guid? userId)
Для демонстрации реализации данного паттерна перепишем пример паттерна Event по-другому:
public Func<ActionResult> XXX(Guid userId)
{
UserData userData = new UserData();
AsyncManager.RegisterTask(
callback => BeginXXX(userId, callback, null),
asyncResult =>
{
userData = EndXXX(asyncResult);
}
);
return () => {
ViewData["userData"] = userData;
return View() ;
};
}
Главное отличие реализации паттерна Delegate
в приведенном фрагменте от паттерна Event
состоит в том, что для возвращения результата выполнения действия используется не ActionResult
, а Func<ActionResult>,
который представляет собой анонимную функцию, возвращающую результат в виде ActionResult
. По сравнению с паттерном Event
данный паттерн имеет упрощенный единый механизм, не разделенный на несколько методов, и максимально напоминает работу действий в синхронных контроллерах. При использовании этого паттерна у разработчика нет необходимости заботиться ни об обработке AsyncManager.OutstandingOperations
, ни о заполнении AsyncManager.Parameters
.
- Паттерн IAsyncResult
- Creating a Delegate
- Chapter 7 Delegates and Events
- Delegates
- Delegates Chaining (Multicast Delegates)
- Implementing Callbacks Using Delegates
- Difference between Events and Delegates
- Generic Delegates
- Семантика паттернов
- Исторический очерк о паттерне создания голубого океана
- Паттерны
- Литературная критика и паттерны проектирования