问题
www.sychzs.cn Core 2.0中如何将初始参数传递给中间件?
回答
在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数:
公共课 GreetingOptions { 公共字符串 GreetAt { 得到;放; } 公共字符串 GreetTo { 得到;放; } }
添加中间件:
公共类 GreetingMiddleware { 私有只读RequestDelegate _next; 私人只读 GreetingOptions _options; 公共 GreetingMiddleware(RequestDelegate 接下来,GreetingOptions 选项) { _下一个=下一个; _选项=选项; } 公共异步任务调用(HttpContext 上下文) { var message = $"好{_options.GreetAt} {_options.GreetTo}"; 等待 context.Response.WriteAsync(消息); } }
答案1:实例类型
添加扩展方法来配置中间件:
公共静态 IApplicationBuilder UseGreetingMiddleware(此 IApplicationBuilder 应用程序,GreetingOptions 选项) { return app.UseMiddleware(选项); }
使用中间件:
公共无效配置(IApplicationBuilder 应用程序,IHostingEnvironment env) { app.UseGreetingMiddleware(new GreetingOptions { GreetAt =“早上”, GreetTo =“塔希尔” }); }
答案2:函数类型
添加扩展方法来配置中间件:
公共静态 IApplicationBuilder UseGreetingMiddlewareAction(此 IApplicationBuilder 应用程序,ActionoptionsAction) { var options = new GreetingOptions(); 选项操作(选项); return app.UseMiddleware (选项); }
使用中间件:
公共无效配置(IApplicationBuilder 应用程序,IHostingEnvironment env) { app.UseGreetingMiddlewareAction(选项=> { options.GreetAt = "早上好"; options.GreetTo = "塔希尔"; }); }
以上两种方法的结果是一致的。
正在运行,页面显示:
讨论
之前我们讨论过,最佳实践是在单独的类中定义中间件并使用扩展方法将其添加到请求管道中。我们可能还需要向中间件传递参数。通过研究www.sychzs.cn Core源码以及其他网上的例子,我总结了以上两种模式。
以上两种解决方案都非常直观。我们将参数封装到 POCO 类中,然后创建一个扩展方法来接受以下参数:
1。 POCO 示例
2。需要调用的函数(函数内设置POCO)
注意:POCO实例通过构造函数传入中间件。 UseMiddleware() 方法接收可变参数 params object[] 并将这些参数传递给中间件构造函数。
配置服务
这些模式还可用于将服务实例添加到服务容器。为了方便说明,我们先添加一个服务:
公共接口IMessageService { 字符串FormatMessage(字符串消息); } 公共类 MessageService :IMessageService { 私人只读 GreetingOptions _options; 公共消息服务(GreetingOptions 选项) { _选项=选项; } 公共字符串FormatMessage(字符串消息) { return $"好 {_options.GreetAt} {_options.GreetTo} - {message}"; } }
添加以下任意扩展方法来配置服务:
public static IServiceCollection AddMessageService(此IServiceCollection服务,GreetingOptions选项) { 返回 services.AddScoped(factory => new MessageService(options)); }public static IServiceCollection AddMessageServiceAction(此IServiceCollection服务,Action optionsAction) { var options = new GreetingOptions(); 选项操作(选项); 返回 services.AddScoped (factory => new MessageService(options)); }
在Configure()中使用此服务:
公共无效ConfigureServices(IServiceCollection服务) { services.AddMessageService(新的GreetingOptions { GreetAt =“早上”, GreetTo =“塔希尔” }); services.AddMessageServiceAction(选项=> { options.GreetAt = "早上好"; options.GreetTo = "塔希尔"; }); }
因为ConfigureServices()是在Configure()之前执行的,所以我们可以直接在Configure()中注入这个服务:
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment env,IMessageService msg) { www.sychzs.cn(异步(上下文)=> { 等待 context.Response.WriteAsync(msg.FormatMessage("by sanshi")); }); }
正在运行,页面显示:
源码下载
原文:https://www.sychzs.cn/2017/08/29/passing-parameters-to-middleware-in-asp-net-core-2-0/