はい、パイプラインでコンポーネントを定義し、アプリケーションが使用する他のコンポーネントを使用する必要があるため、パイプラインで多くの不要なものをスキップできる可能性があります。async/await
これらのコンポーネントは処理パイプラインの途中にあり、コンポーネントはC# 構文を介してパイプライン内の次のコンポーネントに制御を渡すか、そのコンポーネントで処理を終了するかを決定できるため、ミドルウェアです。
AppFunc
オブジェクトは、カタナで「魔法」が発生する場所です。これは、コンポーネントが呼び出されたときにコンポーネントが使用するロジックであるためです。署名は次のとおりです。
Func<IDictionary<string, object>, Task>;
注:IDictionary<string, object>
は環境値を表し ( ASP.NET ではRequest
andなど)、 Response
OWINHttpContext
標準では、このディクショナリに存在する必要がある特定の値 ( "owin.RequestBody"
orなど) が定義されてい"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);
}
}