Сначала я поговорю непосредственно с двумя утверждениями.
- Параметр
options
переменная , который отправлено передан в , в то время как будет иметь значение CheckConsentNeeded
, установленное на значение ТОЛЬКО В ЭТОЙ ОБЛАСТИ.
Это происходит «только в этой области», но эта формулировка вводит в заблуждение, поскольку значение свойства не возвращается в какой-то более поздний момент. То, что происходит только в Вегасе (эта область) не остается только в Вегасе, потому что ...
- Он вносит изменения в
options =>
лямбду, а затем отправляет измененную версию опций в функцию 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 # делает с лямбдами, когда нет захвата контекста, за исключением того, что он генерирует методы с именами, которые вы не можете вызвать напрямую в коде C #. (Когда происходит захват контекста, это еще не все.)
В какой-то момент, возможно, вскоре после того, как Configure
и ваш ConfigureServices
оба вернутся, конвейер промежуточного программного обеспечения создаст экземпляр CookiePolicyOptions
и передаст его вашей лямбда-функции, которая затем устанавливает указанные вами параметры.
// 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). Затем промежуточное программное обеспечение использует свойства этого объекта для настройки его поведения. Значения этих свойств сохранялись уже давно вне контекста, в котором они были назначены.