浅谈ASP.NET Core 2.0 带初始参数的中间件(译)

 更新时间:2017年10月23日 17:07:09   作者:三生石上(FineUI控件)  
这篇文章主要介绍了浅谈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 5种页面转向方法

    Asp.net 5种页面转向方法

    页面转向也是有技巧的,下面的是asp.net下的几种转向方法。
    2009-02-02
  • ajaxToolkit:AccordionPane演示与应用实例

    ajaxToolkit:AccordionPane演示与应用实例

    ajaxToolkit:AccordionPane演示与应用实例,需要的朋友可以参考一下
    2013-04-04
  • ASP.NET实现按拼音码模糊查询的方法

    ASP.NET实现按拼音码模糊查询的方法

    我们在做数据录入或者查询的时候,经常需要实现按用户输入的拼音码进行数据的模糊查询功能,本文为大家介绍ASP.NET如何实现按拼音码模糊查询,需要的朋友可以参考下
    2015-09-09
  • .net core中的Authorization过滤器使用

    .net core中的Authorization过滤器使用

    这篇文章主要介绍了.net core中的Authorization过滤器使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • asp.net Xml绑定到数据控件的具体实现

    asp.net Xml绑定到数据控件的具体实现

    这篇文章主要介绍了asp.net Xml绑定到数据控件的两种简单方法 ,需要的朋友可以参考下
    2014-06-06
  • 解析ASP.NET Core中Options模式的使用及其源码

    解析ASP.NET Core中Options模式的使用及其源码

    这篇文章主要介绍了ASP.NET Core中Options模式的使用及其源码解析,在ASP.NET Core中引入了Options这一使用配置方式,其主要是为了解决依赖注入时需要传递指定数据问题(不是自行获取,而是能集中配置),需要的朋友可以参考下
    2022-03-03
  • .net基础收集汇总

    .net基础收集汇总

    最近的面试让我知道基础知识的重要性,而我也每天都在网上找一些基础题来看。其实面试无非都是一些理论基础,只有基础过关了,才会被问到技术性的问题,所以第一关一定要打好
    2013-07-07
  • ASP.NET Forms身份认证详解

    ASP.NET Forms身份认证详解

    在这篇文章中,不会涉及ASP.NET的登录系列控件以及membership的相关话题,我只想用比较原始的方式来说明在ASP.NET中是如何实现身份认证的过程。
    2015-09-09
  • 判断WebBrowser浏览器网页加载完成的处理方法

    判断WebBrowser浏览器网页加载完成的处理方法

    .net 中通过 SqlConnection 连接 sql server,我们会发现第一次连接时总是很耗时,但后面连接就很快,这个其实和SqlConnection 的连接池机制有关,正确的理解这个连接池机制,有助于我们编写高效的数据库应用程序。
    2013-04-04
  • GridView控件实现数据的显示和删除(第8节)

    GridView控件实现数据的显示和删除(第8节)

    这篇文章主要介绍了GridView控件实现数据的显示和删除,以新闻网站为例,实现对新闻数据的操作,了解各种数据源控件与数据绑定控件的类型和作用,需要的朋友可以参考下
    2015-08-08

最新评论