问题

在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. c语言二维数组与指针

    问题,以下输出的结果是什么,区别在于哪? void main() { ][] = { ,,,,,,,,,,, }; //输出的3个地址都一样,差别在哪? printf("\n%x" ...

  2. Qt Font

    Font and How to use TTF字体基本知识及其在QT中的应用 Qt为程序添加外部字体 在使用qt 添加第三方字体的时候,在程序开始的时候,使用·QFontDatabse·的静态函数加载 ...

  3. 文件打包代码更新 使用json记录打包文件信息

    经过之前的几次试验 决定使用json记录打包文件信息 #include "Package.h" #include "json/json.h" #include ...

  4. 使用vim鼠标右键无法粘贴问题解决

    问题: Debian中通过终端使用vim,无法通过鼠标粘贴.这是由于一项默认的鼠标配置导致. 解决方法: vi /usr/share/vim/vim80/defaults.vim 查找set mous ...

  5. centos7 dubbokeeper安装

    下载dubbokeeper源码 git clone https://github.com/dubboclub/dubbokeeper   mysql 先执行install-mysql.sh   编译好 ...

  6. 11 Mortal Fibonacci Rabbits

    Problem Figure 4. A figure illustrating the propagation of Fibonacci's rabbits if they die after thr ...

  7. CentOS 7 装好系统一些优化

    1.禁用SELINUX vi /etc/sysconfig/selinux  设置为disabled 2.同步时间*/20 * * * * /usr/sbin/ntpdate pool.ntp.org ...

  8. 递归,回溯和DFS的区别

    递归是一种算法结构,回溯是一种算法思想一个递归就是在函数中调用函数本身来解决问题回溯就是通过不同的尝试来生成问题的解,有点类似于穷举,但是和穷举不同的是回溯会“剪枝”,意思就是对已经知道错误的结果没必 ...

  9. user_mongo_in_a_docker_and_dump_database

    使用 mongo docker 镜像 使用 mongo 镜像是很方便的,直接使用官方镜像就好了,为了今后更方便使用,这里给出依据 restheart-docker 中的 docker-compose. ...

  10. [label][Node.js] Three content management systems base on Node.js

    1. Keystonejs http://keystonejs.com/ 2. Apostrophe http://apostrophenow.org/