对于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函数,但想确保自己具有以下权利:
答案 0 :(得分:2)
我将首先直接针对这两个断言。
- 在
期间传入的发送的options
变量参数会将其CheckConsentNeeded
设置为true IN仅此范围。
“发生” “仅在此范围内”,但该措辞具有误导性,因为该属性值在以后的某个时刻不会恢复。仅在拉斯维加斯(此范围)中发生什么 (仅在此范围内),因为...
- 它会在
options =>
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中的同名对象混淆)。然后,中间件使用该对象的属性来配置其行为。这些属性的值在分配它们的上下文之前一直存在。