【问题标题】:How does this lambda function work in Razor pages tutorial for ASP .NET此 lambda 函数如何在 ASP .NET 的 Razor 页面教程中工作
【发布时间】:2019-01-09 16:22:12
【问题描述】:

我关注 ASP.NET Core 2.2 的 this tutorial,在他们的 ConfigureServices 中,他们具有以下 lambda 函数。

services.Configure<CookiePolicyOptions>(options =>
{
    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
    options.CheckConsentNeeded = context => true;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});

我已阅读 C# 中的 lambda 函数,但想确保我拥有以下权利:

  1. 仅在此范围内发送的选项变量的 CheckConsentNeeded 设置为 true。
  2. 它在 options => lambda 中进行更改,然后将修改后的选项版本发送到 Configure 函数。

【问题讨论】:

  • 1.是的,2。您可以将其视为一个匿名函数,它返回您修改后的 CookiePolicyOptions 类设置

标签: c# asp.net-core lambda razor-pages


【解决方案1】:

我先直接说这两个断言。

  1. sent 传入 whileoptions variable 参数仅在此范围内将其 CheckConsentNeeded 设置为 true。

发生“仅在此范围内”,但该措辞具有误导性,因为属性值不会在以后恢复。 发生仅在拉斯维加斯(此范围)不会留在仅在拉斯维加斯,因为...

  1. 它在 options =&gt; lambda 中进行更改,然后将修改后的选项版本发送到 Configure 函数。

是的,它在此处进行更改,但它不会将对象“发送”到任何地方。就像我(中间件)向您(您的应用程序)询问您的签名(所需的 cookie 设置)并在您签名(修改其属性)时为您持有签名簿(options)。

中间件管道不会放弃对它创建和传入的对象的控制,也不会在返回时接收新对象。继续这个比喻,我不会得到一本新的签名书,里面有你的签名,也不会丢失原来的签名簿,里面有我所有的其他签名(其他属性更改)。

理论上,同一个实例可以传递给多个委托,由您和您使用的任何需要特定设置的中间件提供,每个中间件都可以根据需要更改属性。理论上,无论如何。我不能说这是否会在现实世界中发生,但考虑到它的结构方式,这似乎是可能的。


其他详情

您正在做的是提供一个配置函数稍后由中间件管道调用。为了从不同的角度看问题,让我们将其重构为几乎荒谬的冗长:

// In your 'ConfigureServices' method:
Action<CookiePolicyOptions> myCookieConfigurator = MyCookiePolicyOptionsConfigurationMethod;

services.Configure<CookiePolicyOptions>(myCookieConfigurator);

该课程的其他地方:

private void MyCookiePolicyOptionsConfigurationMethod(CookiePolicyOptions options)
{
    Func<HttpContext, bool> myCheckConsentNeeded = MyCheckConsentNeededMethod;

    options.CheckConsentNeeded = myCheckConsentNeeded;
    options.MinimumSameSitePolicy = SameSiteMode.None;
}

private bool MyCheckConsentNeededMethod(HttpContext context)
{
    return true;
}

这本质上是 C# 编译器在不涉及上下文捕获时对 lambda 所做的事情,除了它生成的方法的名称您不可能在 C# 代码中直接调用。 (当涉及上下文捕获时,还有更多内容。)

在某个时刻,可能在 Configure 和您的 ConfigureServices 都返回之后很久,中间件管道会创建一个 CookiePolicyOptions 实例并将其传递给您的 lambda 函数,然后它会设置您指定的选项。

// Somewhere in the middleware (although a bit more involved than this).

CookiePolicyOptions cookiePolicyOptions = new CookiePolicyOptions();
that_guys_myCookieConfigurator_delegate(cookiePolicyOptions);
// now store 'cookiePolicyOptions' for middleware to use

那么cookie中间件如何使用刚刚创建和配置的对象呢?

如果中间件采用 CookiePolicyOptions 参数,则该对象将被注入到对其 Configure 方法的调用中(不要与 Startup.cs 中的同名方法混淆)。然后中间件使用该对象的属性来配置其行为。这些属性的值在它们被分配的上下文中已经存在很长时间了。

【讨论】:

    猜你喜欢
    • 2020-12-29
    • 2019-12-20
    • 2020-12-21
    • 2021-07-04
    • 1970-01-01
    • 2018-09-14
    • 2019-11-22
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多