![](/img/trans.png)
[英]ASP.NET Core - IStartupFilter equivalent for ConfigureServices?
[英]ASP.NET Core IStartupFilter implementation
我目前正在学习 ASP.NET Core 及其功能。 它的功能之一是IStartupFilter
接口,用于在Startup
方法中注册中间件。 我有一个Configure
方法的示例实现(未显示实现此接口的整个 class),它注入了一个名为PrincipalInjectionMiddleware
的自定义中间件:
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
builder.UseMiddleware<PrincipalInjectionMiddleware>();
next(builder);
};
}
我了解Action<IApplicationBuilder>
封装了一个不返回值的方法。 那么为什么上面的 return 语句被接受为有效语法而不是 this ( _serviceProvider
变量来自此处未显示的构造函数):
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
IApplicationBuilder builder = new ApplicationBuilder(_serviceProvider);
builder.UseMiddleware<PrincipalInjectionMiddleware>();
next(builder);
}
上面的代码给出了并非所有代码路径都返回值的错误。 下面的代码也不起作用,因为无法将void
转换为Action<IApplicationBuilder>
:
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
IApplicationBuilder builder = new ApplicationBuilder(_serviceProvider);
builder.UseMiddleware<PrincipalInjectionMiddleware>();
return next(builder);
}
我的理由是Action<IApplicationBuilder>
就像void
因为它不返回值。 这是一个“特殊”案例吗? 是否可以在没有 lambda 表达式的情况下重写此方法? 如果是这样,怎么做?
发生这种情况的原因是因为名为 Configure 的方法返回了一个 Action,这意味着一个将 IApplicationBuilder 作为参数并返回 void 的 METHOD。
Action表示返回 void 的方法。
Func表示返回某些东西的方法。
Action 和 Func 是“委托”的包装器,它们只是方法的“指针”。
委托是一种将方法存储在变量中的方法。 创建对可以在其他地方传递和调用的方法的引用。
换句话说,它们是使用委托来存储对方法的引用的语法糖(或多或少)。
例如,您可以这样做:
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
var builder = new ApplicationBuilder(_serviceProvider);
builder.UseMiddleware<PrincipalInjectionMiddleware>();
next(builder);
return next;//notice I am returning the ACTION not the return of the action
}
让我举一个更清楚的例子:
public Action<IApplicationBuilder> Configure()
{
BuildAction(new ApplicationBuilder(_serviceProvider));//call the method
return BuildAction;//return the actual method name... NOT a method call
}
//this method is being returned as a reference in the Configure method...
private void BuildAction(IApplicationBuilder builder)
{
builder.UseMiddleware<PrincipalInjectionMiddleware>();
}
请参阅前面的示例,我正在返回一个 ACTUAL 方法...而不是方法调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.