欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 编程语言 > asp.net >内容正文

asp.net

探索asp.net core中的istartupfilter -尊龙游戏旗舰厅官网

发布时间:2024/10/12 asp.net 25 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 探索asp.net core中的istartupfilter 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

原文:exploring istartupfilter in asp.net core
作者:andrew lock
译者:lamond lu

在本篇博客中,我将介绍一下istartupfilter, 以及如何在asp.net core中使用它。在下一篇博客中,我将介绍一下如何在外部中间件中使用istartupfilter

istartupfilter接口存在于microsoft.aspnetcore.hosting.abstractions程序集中,它非常简单,仅定义了一个接口方法。

namespace microsoft.aspnetcore.hosting {public interface istartupfilter{action configure(action next);} }

其中configure方法返回了一个变量action。

当创建一个asp.net core应用程序的时候,iapplicationbuilder负责配置asp.net core的中间件管道。例如你可以在startup.cs文件的configure方法中,看到以下类似的代码。

public void configure(iapplicationbuilder app) {app.usestaticfiles();app.usemvc(routes =>{routes.maproute(name: "default",template: "{controller=home}/{action=index}/{id?}");}); }

在这个方法中,你可以直接使用方法提供的iapplicationbuilder参数,并且可以向其中添加各种中间件。使用istartupfilter, 你可以指定并返回一个action类型的泛型委托,这意味你除了可以使用方法提供的泛型委托配置iapplicationbuilder对象, 还需要返回一个泛型委托。

istartupfilter方法可以接受一个配置iapplicationbuilder的方法,换而言之istartupfilter.configure方法可以使用startup.configure方法作为参数。

例:

startup _startup = new startup(); action startupconfigure = _startup.configure;//后续会补充startupfilter1类的代码 istartupfilter filter1 = new startupfilter1(); action filter1configure = filter1.configure(startupconfigure)//后续会补充startupfilter2类的代码 istartupfilter filter2 = new startupfilter2(); action filter2configure = filter2.configure(filter1configure)

如果之前你学习过asp.net core的中间件管道,对于这个代码,你可能会感觉很熟悉。这里我们正在建立另一条管道, 它是一个configure方法的管道,而不是中间件管道。 这就是istartupfilter的目的,允许在应用程序中创建configure方法的管道。

现在我们对istartupfilter的签名有了更进一步的理解,接下来我们可以看看它在asp.net core框架中的用法。

要查看istartupfilter是如果被调用的,你可以在查看microsoft.aspnetcore.hosting程序集中的webhost类。 当你在webhostbuilder对象上调用build方法时,实现istartupfilter接口对象会被调用。 这个代码通常出现在program.cs文件中,例如:

public class program {public static void main(string[] args){var host = new webhostbuilder().usekestrel() .usecontentroot(directory.getcurrentdirectory()).usestartup().build(); // 这个会调用buildapplication方法host.run(); } }

下面是buildapplication方法的部分代码,你可以看到这个方法负责初始化中间件管道。方法的返回值requestdelegate表示了一个完整的管道,当请求到达的时候,kestral服务器可以调用它。

private requestdelegate buildapplication() {..iapplicationbuilder builder = builderfactory.createbuilder(server.features);builder.applicationservices = _applicationservices;var startupfilters = _applicationservices.getservice>();action configure = _startup.configure;foreach (var filter in startupfilters.reverse()){configure = filter.configure(configure);}configure(builder);return builder.build(); }

首先,此方法创建iapplicationbuilder的实例,该实例将用于构建中间件管道,并将applicationservices设置为已配置的di容器。

接下来的代码块很意思。首先,从di容器中获取了一个集合ienumerable

现在我们通过循环遍历每个istartupfilter(以相反的顺序),传入startup.configure方法,然后更新局部变量configure来创建configure方法的管道。这种方式实现了一种嵌套管道的效果。例如,如果我们有三个istartupfilter实例,你最终会得到类似这样的东西,其中内部configure方法在参数中传递给外部方法:

局部变量configure的最终值会被iapplicationbuilder调用来执行实际的中间件管道配置。 调用builder.build方法之后会生成处理http请求所需的requestdelegate。

前面我虽然描述了istartupfilter的用途,但是可能查看一些现成的实现会更容易理解一些。 默认情况下,webhostbuilder在初始化时会注册一个istartupfilter - autorequestservicesstartupfilter

public class autorequestservicesstartupfilter : istartupfilter {public action configure(action next){return builder =>{builder.usemiddleware();next(builder);};} }

本质上,它在中间件管道的开头添加了一个额外的中间件,即requestservicescontainermiddleware。

这是唯一一个默认注册的istartupfilter,因此在这种情况下,参数next将是startup类的configure方法。

这基本上就是istartupfilter的全部内容 - 它是一种在配置的管道的开头或结尾添加额外中间件(或其他配置)的方法。

注册istartupfilter很简单,只需像往常一样在你的configureservices方法中注册它。 默认情况下,在webhostbuilder中已经注册了autorequestservicesstartupfilter

private iservicecollection buildhostingservices() {...services.addtransient();... }

以下是requestservicescontainermiddleware的部分代码

public class requestservicescontainermiddleware {private readonly requestdelegate _next;private iservicescopefactory _scopefactory;public requestservicescontainermiddleware(requestdelegate next, iservicescopefactory scopefactory){_scopefactory = scopefactory;_next = next;}public async task invoke(httpcontext httpcontext){var existingfeature = httpcontext.features.get();if (existingfeature?.requestservices != null){await _next.invoke(httpcontext);return;}using (var feature = new requestservicesfeature(_scopefactory)){try{httpcontext.features.set(feature);await _next.invoke(httpcontext);}finally{httpcontext.features.set(existingfeature);}}} }

该中间件负责设置iserviceprovidersfeature。 创建时,requestservicesfeature为请求创建新的iservicescope和iserviceprovider。 它将负责使用scoped生命周期添加到di容器的依赖项的创建和处理。

一般来说,我不认为在用户的应用程序中需要使用istartupfilter。 就其本质而言,用户可以在configure方法中定义中间件管道,因此istartupfilter是不必要的。

我能想到以下几种需要使用istartupfilter的场景:

  • 你自己创建了一个库,你需要确保你的中间件在中间件管道的开头(或结尾)运行。
  • 你正在使用一个使用istartupfilter的库,您需要确保您的中间件在它之前运行。

本篇博文中,我讲解了istartupfilter以及webhost如何使用它在构建中间件管道。 在下一篇文章中,我将探讨istartupfilter的具体用法。

本篇是作者早期的一篇博文,个人觉着对istartupfilter讲解的比较清楚,就翻译了一下。在作者的后期博文中,作者提供了许多istartupfilter的使用场景,例如

  • 在asp.net core项目启动前,使用istartupfilter验证强类型配置
  • 在asp.net core项目启动前,使用istartupfilter进行数据库迁移和缓存预读取

有兴趣的同学可以自己阅读一下,后续我会选择一些有意思的文章翻译一下。

转载于:https://www.cnblogs.com/lwqlun/p/10279874.html

总结

以上是尊龙游戏旗舰厅官网为你收集整理的探索asp.net core中的istartupfilter的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图