Да, вы потенциально сможете пропустить много ненужных вещей в конвейере, так как вы определите компоненты в конвейере вместе с другими компонентами, которые не обязательно сделаны вами, что ваше приложение будет использовать. Эти компоненты являются промежуточным программным обеспечением, поскольку они находятся в середине конвейера обработки, и компоненты могут решить передать управление следующему компоненту в конвейере с помощью синтаксиса C# async/await
или завершить обработку этого компонента.
Объект AppFunc
, где «магия» происходит в Katana, потому что логика, которая использует компонент при вызове, подпись это:
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);
}
}