2017-03-01 20 views
7

現在、いくつかのOWINミドルウェアを含むライブラリを構築しています。これらのミドルウェアは特定の順序で実行する必要があります。 OWINの最初のリリースの1つに、IAppBuilderインターフェイスがありました。しかし、IAppBuilderはもはやOWINの一部ではなく、Microsoft.Owinの一部です。私はユーザーにMicrosoft.Owinへの依存を強制したくありません。IAppBuilderなしでOwinにミドルウェアを追加する方法

Microsoft.Owinを使用せずにミドルウェアをOWINパイプラインに追加する方法は何ですか?

+1

多分これはあなたを助け:https://visualstudiomagazine.com/articles/2015/05/01/inject-custom-middleware.aspx – Rumpelstinsk

+0

おかげで、残念ながらそれはdoesnのt。この例では、OWINの一部ではないIApplicationBuilderインターフェイスも使用しています。 – Jeroen

答えて

0

時間がかかりましたが、わかりました。

Owinで指定されたように、まず定義:

public delegate Task AppFunc(IDictionary<string, object> environment); 

public delegate AppFunc MidFunc(AppFunc next); 

public delegate MidFunc MidFactory(IDictionary<string, object> startupProperties); 

public delegate void BuildFunc(MidFactory midFactory); 

私はジェネリックの狂気を避けるために、ここでdelegateを使用しています。 BuildFuncを使用してパイプラインを構築するために

public static BuildFunc UseOwin(this IAppBuilder builder) 
{ 
    return middleware => builder.Use(middleware(builder.Properties)); 
} 

、あなたがBuildFuncの拡張機能を作成することができます:BuildFuncIAppBuilderから行くために

public static BuildFunc UseMyFramework(this BuildFunc buildFunc) 
{ 
    buildFunc(startupProperties => BuildPipeline(startupProperties)); 

    return buildFunc; 
} 

返すことをお勧めしチェーンのためにBuildFunc

public static MidFunc BuildPipeline(IDictionary<string, object> startupProperties) 
{ 
    return next => LogMiddleware(AuthenticateMiddleware(MyApplication)); 

    // Or this if you don't supply your own AppFunc 
    return next => LogMiddleware(AuthenticateMiddleware(next)); 
} 

public static AppFunc LogMiddleware(AppFunc next) 
{ 
    AppFunc middleware = async environment => 
    { 
     // Log request 

     await next(environment); 
    }; 

    return middleware; 
} 

public static AppFunc AuthenticateMiddleware(AppFunc next) 
{ 
    AppFunc middleware = async environment => 
    { 
     // authenticate request 

     await next(environment); 
    }; 

    return middleware; 
} 

public static async Task MyApplication(IDictionary<string, object> environment) 
{ 
    await Task.CompletedTask; 
} 

あなたはまだあなたのフレームワークにOwin実装を接続する必要があります:パイプラインを構築

は、実際のAppFuncで終わる一緒にし、必要に応じてMidFunc Sをリンク以外の何ものでもありません。私はこのためにMicrosoft.Owinを使用します。

app.UseOwin().UseMyFramework() 
関連する問題