2017-03-01 74 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() 
相关问题