探索asp.net core中的istartupfilter -ag凯发k8国际
原文: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。
当创建一个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如果之前你学习过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下面是buildapplication方法的部分代码,你可以看到这个方法负责初始化中间件管道。方法的返回值requestdelegate表示了一个完整的管道,当请求到达的时候,kestral服务器可以调用它。
private requestdelegate buildapplication() {..iapplicationbuilder builder = builderfactory.createbuilder(server.features);builder.applicationservices = _applicationservices;var startupfilters = _applicationservices.getservice首先,此方法创建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本质上,它在中间件管道的开头添加了一个额外的中间件,即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该中间件负责设置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
总结
以上是ag凯发k8国际为你收集整理的探索asp.net core中的istartupfilter的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: