Ответ 1
Да, вы потенциально сможете пропустить много ненужных вещей в конвейере, поскольку вы определите компоненты в конвейере вместе с другими компонентами, которые не обязательно сделаны вами, что ваше приложение будет использовать. Эти компоненты являются промежуточным программным обеспечением, поскольку они находятся в середине конвейера обработки, и компоненты могут решить передать управление следующему компоненту в конвейере с помощью синтаксиса async/await
С# или завершить обработку этого компонента.
Объект AppFunc
- это место, где "магия" происходит в Катане, потому что это логика, которую компонент использует при ее вызове, подпись такова:
Func<IDictionary<string, object>, Task>;
Примечание:
IDictionary<string, object>
представляет значения среды (например,Request
иResponse
; думаюHttpContext
в ASP.NET), а стандарт OWIN определяет определенные значения, которые должны существовать в этом словаре, например"owin.RequestBody"
или"owin.ResponseBody"
. Katana - это реализация Microsoft стандарта OWIN и, как таковая, и другие словарные элементы доступны из коробки.
Примером компонента может быть метод, который соответствует сигнатуре AppFunc
(который равен Func<IDictionary<string, object>, Task>
, например:
public async Task Invoke(IDictionary<string, object> environment)
{
// Do processing...
// Wait for next component to complete
await _nextComponent(environment);
// Do more processing...
}
Примечание. OWIN ожидает, что метод вернет
Task
или сгенерирует исключение, поэтомуreturn null;
будет недействительным.
Итак, как вы узнаете, каким будет следующий компонент?
Конструктор вашего компонента должен принять параметр Func<IDictionary<string, object>, Task>
, например:
public class HelloWorldCOmponent
{
Func<IDictionary<string, object>, Task> _next;
public HelloWorldComponent(Func<IDictionary<string, object>, Task> next)
{
_next = next;
}
public async Task Invoke(IDictionary<string, object> environment)
{
// Do something
// Wait for next component to return
await _next(environment);
}
}