浅谈ASP.NET Core 2.0 带初始参数的中间件(译)
问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class GreetingOptions { public string GreetAt { get; set; } public string GreetTo { get; set; } } 添加一个中间件: public class GreetingMiddleware { private readonly RequestDelegate _next; private readonly GreetingOptions _options; public GreetingMiddleware(RequestDelegate next,GreetingOptions options) { _next = next; _options = options; } public async Task Invoke(HttpContext context) { var message = $"Good {_options.GreetAt} {_options.GreetTo}"; await context.Response.WriteAsync(message); } } 答案1:实例类型 添加一个扩展方法来配置中间件: public static IApplicationBuilder UseGreetingMiddleware(this IApplicationBuilder app,GreetingOptions options) { return app.UseMiddleware<GreetingMiddleware>(options); } 使用中间件: public void Configure(IApplicationBuilder app,IHostingEnvironment env) { app.UseGreetingMiddleware(new GreetingOptions { GreetAt = "Morning",GreetTo = "Tahir" }); } 答案2:函数类型 添加一个扩展方法来配置中间件: public static IApplicationBuilder UseGreetingMiddlewareAction(this IApplicationBuilder app,Action<GreetingOptions> optionsAction) { var options = new GreetingOptions(); optionsAction(options); return app.UseMiddleware<GreetingMiddleware>(options); } 使用中间件: public void Configure(IApplicationBuilder app,IHostingEnvironment env) { app.UseGreetingMiddlewareAction(options => { options.GreetAt = "Morning"; options.GreetTo = "Tahir"; }); } 上述两种方法结果一致。 运行,此时页面显示: 讨论 之前我们曾讨论过,在单独的类中定义中间件并使用扩展方法将其添加到请求管道中是最佳实践。我们也可能需要向中间件传入参数,通过对ASP.NET Core源代码以及其他在线示例的学习,我总结出来上面两种模式。 上述的两种解决方法都非常直观。我们将参数封装到一个POCO类中,然后创建一个扩展方法来接受下面的参数: 1. POCO实例 2. 需要调用的函数(在函数内设置POCO) 注:POCO实例通过构造函数传入中间件。UseMiddleware()方法接收可变参数params object[],并将这些参数传入中间件构造函数。 配置服务 这些模式也能用于向服务容器中添加服务实例。为了便于说明,我们先添加一个服务: public interface IMessageService { string FormatMessage(string message); } public class MessageService : IMessageService { private readonly GreetingOptions _options; public MessageService(GreetingOptions options) { _options = options; } public string FormatMessage(string message) { return $"Good {_options.GreetAt} {_options.GreetTo} - {message}"; } } 添加如下任一个扩展方法来配置服务: public static IServiceCollection AddMessageService(this IServiceCollection services,GreetingOptions options) { return services.AddScoped<IMessageService>(factory => new MessageService(options)); } public static IServiceCollection AddMessageServiceAction(this IServiceCollection services,Action<GreetingOptions> optionsAction) { var options = new GreetingOptions(); optionsAction(options); return services.AddScoped<IMessageService>(factory => new MessageService(options)); } 在Configure()中使用此服务: public void ConfigureServices(IServiceCollection services) { services.AddMessageService(new GreetingOptions { GreetAt = "Morning",GreetTo = "Tahir" }); services.AddMessageServiceAction(options => { options.GreetAt = "Morning"; options.GreetTo = "Tahir"; }); } 因为ConfigureServices()先于Configure()执行,因此我们可以直接在Configure()注入此服务: public void Configure(IApplicationBuilder app,IHostingEnvironment env,IMessageService msg) { app.Run(async (context) => { await context.Response.WriteAsync(msg.FormatMessage("by sanshi")); }); } 运行,此时页面显示: 源代码下载 原文:https://tahirnaushad.com/2017/08/29/passing-parameters-to-middleware-in-asp-net-core-2-0/ 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在VS 2012中创建和运行MVC 5项目
- Asp.net配合easyui实现返回json数据实例
- asp.net-mvc – ASP.Net MVC输出缓存:指令或配置设置配置文
- asp.net-mvc – 默认情况下,Html.TextArea会生成额外的换行
- 从数据到代码——基于T4的代码生成方式
- asp.net-mvc – 并不总是创建__RequestVerificationToken
- ASP.NET 4中的可扩展输出缓存(可以缓存页面/控件等)
- asp.net-mvc – MVC3非顺序隐藏输入索引需要先来吗?
- asp.net – 对于想要将一切都变成.NET控件的人,您会怎么说?
- asp.net-mvc – 命名空间’System.Web.Mvc’中不存在’Ajax
- Fiddler无法正常抓取谷歌等浏览器的请求_解决方案
- asp.net – 从代码后面添加文本框服务器控件?
- asp.net-mvc – 所有ASP.NET Web API控制器返回4
- Exceptionless - .Net Core开源日志框架
- asp.net-mvc-2 – ASP.NET MVC数据注释客户端验证
- 开始使用ASP.NET Identity,初级篇
- asp.net-mvc-3 – jQuery.validator.unobtrusive
- asp.net – 将* .domain.com和domain.com重定向到
- asp.net – 我可以在Medium trust中创建一个可写
- .net – Viewstate隐藏字段如此之大,一切都会崩溃