问题

在ASP.NET Core的安装过程中,如何将参数传递给中间件?

在一个空的项目中添加一个POCO类来保存中间件的参数,

  1. publicclass GreetingOptions

  2. {

  3. public string GreetAt { get; set; }

  4. public string GreetTo { get; set; }

  5. }

添加一个中间件,

  1. publicclass GreetingMiddleware

  2. {

  3. private readonly RequestDelegate next;

  4. private readonly GreetingOptions options;

  5. public GreetingMiddleware(

  6. RequestDelegate next,

  7. GreetingOptions options)

  8. {

  9. this.next = next;

  10. this.options = options;

  11. }

  12. public async Task Invoke(

  13. HttpContext context)

  14. {

  15. var message = $"Good {this.options.GreetAt} {this.options.GreetTo}";

  16. await context.Response.WriteAsync(message);

  17. }

  18. }

解决方案A - 实例类型

添加扩展方法来配置中间件,

  1. publicstatic IApplicationBuilder UseGreeting(

  2. this IApplicationBuilder app, GreetingOptions options)

  3. {

  4. return app.UseMiddleware<GreetingMiddleware>(options);

  5. }

配置中间件,

  1. publicvoid Configure(

  2. IApplicationBuilder app,

  3. IHostingEnvironment env)

  4. {

  5. app.UseGreeting(new GreetingOptions

  6. {

  7. GreetAt = "Morning",

  8. GreetTo = "Tahir"

  9. });

  10. }

解决方案B - 功能类型

添加扩展方法来配置中间件,

  1. publicstatic IApplicationBuilder UseGreeting(

  2. this IApplicationBuilder app, Action<GreetingOptions> configureOptions)

  3. {

  4. var options = new GreetingOptions();

  5. configureOptions(options);

  6. return app.UseMiddleware<GreetingMiddleware>(options);

  7. }

配置中间件,

  1. publicvoid Configure(

  2. IApplicationBuilder app,

  3. IHostingEnvironment env)

  4. {

  5. app.UseGreeting(options =>

  6. {

  7. options.GreetAt = "Morning";

  8. options.GreetTo = "Tahir";

  9. });

  10. }

讨论

我在之前的文章 中讨论过, 在独立的类中定义中间件并使用扩展方法添加到管道中是一种好的做法 。虽然我们也可能需要将信息传递给我们的中间件类,但是在深入挖掘ASP.NET Core源代码和其他样本时,我已经遇到了两种模式。

如上面的解决方案A和B所证明的那样,这是非常简单的。我们将我们的参数包装在一个POCO类中,并创建一个扩展方法,

  1. POCO实例

  2. 函数调用,进而建立POCO。

请注意

POCO传递给构造函数中的中间件。UseMiddleware()方法需要params对象[]参数传递到中间件构造函数。

配置服务

这些模式也可以用来设置 服务容器的依赖注入。为了演示添加服务,

  1. publicclass MessageService : IMessageService

  2. {

  3. private readonly MessageOptions options;

  4. public MessageService(MessageOptions options)

  5. {

  6. this.options = options;

  7. }

  8. public string FormatMessage(string message)

  9. {

  10. // use options

  11. returnthis.options.Format == MessageFormat.None ? message :

  12. this.options.Format == MessageFormat.Upper ? message.ToUpper() :

  13. message.ToLower();

  14. }

  15. }

添加这些扩展方法来配置服务,

  1. // Instance Type

  2. publicstatic IServiceCollection AddMessageFormatter(

  3. this IServiceCollection services, MessageOptions options)

  4. {

  5. return services.AddScoped<IMessageService>(factory =>

  6. {

  7. returnnew MessageService(options);

  8. });

  9. }

  10. // Function Type

  11. publicstatic IServiceCollection AddMessageFormatter(

  12. this IServiceCollection services, Action<MessageOptions> configureOptions)

  13. {

  14. var options = new MessageOptions();

  15. configureOptions(options);

  16. return services.AddScoped<IMessageService>(factory =>

  17. {

  18. returnnew MessageService(options);

  19. });

  20. }

使用其中之一配置服务,

  1. // Instance Type

  2. publicvoid ConfigureServices(

  3. IServiceCollection services)

  4. {

  5. services.AddMessageFormatter(new MessageOptions

  6. {

  7. Format = MessageFormat.Lower

  8. });

  9. }

  10. // Function Type

  11. publicvoid ConfigureServices(

  12. IServiceCollection services)

  13. {

  14. services.AddMessageFormatter(options =>

  15. {

  16. options.Format = MessageFormat.Lower;

  17. });

  18. }

 

将参数传递给ASP.NET Core 2.0中的中间件的更多相关文章

  1. 基础教程:上传/下载ASP.NET Core 2.0中的文件

    问题 如何上传和下载ASP.NET Core MVC中的文件. 解 在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件. publicvoid ConfigureServices( ...

  2. 避免在ASP.NET Core 3.0中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...

  3. Jmeter----A接口response中body的某一个参数传递给B接口request的body中使用(参数的传递)

    示例:将接口"获取待办列表"response中body的id值传递给接口"删除待办"request的body中使用: 操作步骤如下: 第一步:给"获取 ...

  4. 在ASP.NET Core 2.0中使用CookieAuthentication

    在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...

  5. 如何在ASP.NET Core 2.0中使用Razor页面

    如何在ASP.NET Core 2.0中使用Razor页面  DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...

  6. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  7. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

  8. ASP.NET Core 2.0 中读取 Request.Body 的正确姿势

    原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...

  9. ASP.NET Core 1.0 中的依赖项管理

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

随机推荐

  1. ROS Navigation中的map_server地图包功能和使用

    博客参考 http://wiki.ros.org/map_server 和 https://www.ncnynl.com/archives/201708/1897.html 1. 安装map_serv ...

  2. mybatis总结回顾

    1.mybatis的介绍 轻量级数据持久层框架,替代hibernate 2.mybatis的入门 导包-->配置文件(类名.xml.SqlMapConfig.xml) 类名.xml:放映射.sq ...

  3. 获取weibo用户所有的关注列表

    1.新浪微博Python SDK笔记——获取粉丝列表或关注列表 http://www.tuicool.com/articles/VnQ3ye 2.friendships/friends关注列表 fri ...

  4. BI实施的四个层次

    满足业务需求 注重数据分析汇总 统一.高效的系统集成越来越麻烦.管理人员穿梭在具有不同风格.使用逻辑的系统间,越来越厌倦,众多系统之间的业务逻辑.数据含义不一致,使用户无法判 断数据的准确性.任何一个 ...

  5. PHP(二)变量和常量

  6. 原型模式及C++实现

    以下是我自己学习设计模式的感想. 原型模式 学过C++的都知道拷贝构造函数,复制一个对象分为浅拷贝和深拷贝. 浅拷贝:就是给对象中的每个成员变量进行复制,就是把A1类中的变量直接赋给A2类中变量,属于 ...

  7. 微信小程序Wepy框架的三个事件交互($broadcast,$emit,$invoke)

    $broadcast: $broadcast事件是由父组件发起,所有子组件都会收到此广播事件,除非事件被手动取消.事件广播的顺序为广度优先搜索顺序,如上图,如果页面Page_Index发起一个$bro ...

  8. java并发编程实战:第十二章---并发程序的测试

    并发程序中潜在错误的发生并不具有确定性,而是随机的. 安全性测试:通常会采用测试不变性条件的形式,即判断某个类的行为是否与其规范保持一致 活跃性测试:进展测试和无进展测试两方面,这些都是很难量化的(性 ...

  9. R12.1.3 patch9239090

    参考文档:Oracle E-Business Suite Release 12.1.3 Readme [ID 1080973.1]1.调整参数_disable_fast_validate=TRUEpg ...

  10. Proxy account failing to run SSIS Error (Proxy (11) is not allowed for subsystem "SSIS" and user "AB\testuser ".

    USE [msdb]EXEC msdb.dbo.sp_grant_login_to_proxy @proxy_name=N'SSISProxyAgentV1', @login_name=N'WTC\E ...