我目前正在构建一个包含几个OWIN中间件的库.这些中间件应按特定顺序执行.在OWIN的第一个版本中,有一个IAppBuilder界面.但是,IAppBuilder它不再是OWIN的一部分,而是Microsoft.Owin的一部分.我不想强迫我的用户依赖Microsoft.Owin.
在不使用Microsoft.Owin的情况下,将中间件添加到OWIN管道的首选方法是什么?
虽然花了一些时间,但我想我已经明白了。
首先是 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);
Run Code Online (Sandbox Code Playgroud)
我delegate在这里使用是为了避免泛型的疯狂。
从IAppBuilder到BuildFunc:
public static BuildFunc UseOwin(this IAppBuilder builder)
{
return middleware => builder.Use(middleware(builder.Properties));
}
Run Code Online (Sandbox Code Playgroud)
为了使用 构建管道BuildFunc,您可以在 上创建扩展BuildFunc:
public static BuildFunc UseMyFramework(this BuildFunc buildFunc)
{
buildFunc(startupProperties => BuildPipeline(startupProperties));
return buildFunc;
}
Run Code Online (Sandbox Code Playgroud)
返回BuildFuncfor 链接是一个很好的做法。
构建管道只不过是将MidFuncs 连接在一起,并可选择以实际的 结尾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;
}
Run Code Online (Sandbox Code Playgroud)
您仍然需要将 Owin 实现连接到您的框架。我为此使用 Microsoft.Owin:
app.UseOwin().UseMyFramework()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |