此Lambda函数如何在ASP .NET的Razor页面教程中工作

时间:2019-01-09 16:22:12

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

对于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. 仅在此范围内发送时发送的options变量的CheckConsentNeeded设置为true。
  2. 它会更改选项=> lambda,然后将选项的修改后的版本发送到Configure函数中。

1 个答案:

答案 0 :(得分:2)

我将首先直接针对这两个断言。

  
      
  1. 期间传入的 发送的options 变量参数会将其CheckConsentNeeded设置为true IN仅此范围。
  2.   

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

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

是的,它在那里进行更改,但是它没有“发送”对象到任何地方。就像我(中间件)向您(您的应用程序)询问您的亲笔签名(所需的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中的同名对象混淆)。然后,中间件使用该对象的属性来配置其行为。这些属性的值在分配它们的上下文之前一直存在。