2017-03-01 75 views
7

我目前正在構建一個包含多個OWIN中間件的庫。這些中間件應該按照一定的順序執行。在OWIN的第一個版本中,有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

謝謝,但遺憾的是它不」噸。這個例子使用IApplicationBuilder接口,它也不是OWIN的一部分。 – 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位置避免仿製藥的瘋狂。

如果要從IAppBuilderBuildFunc

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

爲了建立使用BuildFunc管道,可以在BuildFunc創建擴展:

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

    return buildFunc; 
} 

這是一個很好的做法返回鏈接爲BuildFunc

建設管道無非是MidFunc小號連在一起並任選與實際AppFunc結束更多:

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實現連接到你的框架。我用Microsoft.Owin此:

app.UseOwin().UseMyFramework() 
相關問題