我先直接说这两个断言。
-
sent 传入 while 的 options variable 参数仅在此范围内将其 CheckConsentNeeded 设置为 true。
它发生“仅在此范围内”,但该措辞具有误导性,因为属性值不会在以后恢复。 发生仅在拉斯维加斯(此范围)不会留在仅在拉斯维加斯,因为...
- 它在
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 中的同名方法混淆)。然后中间件使用该对象的属性来配置其行为。这些属性的值在它们被分配的上下文中已经存在很长时间了。