繁体   English   中英

ASP.NET 核心 IStartupFilter 实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM