Как работает эта лямбда-функция в учебнике по страницам Razor для ASP .NET - PullRequest
0 голосов
/ 09 января 2019

Я следую этому учебнику для ASP.NET Core 2.2, а в их ConfigureServices есть следующая лямбда-функция.

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 #, но хочу убедиться, что у меня есть следующие права:

  1. Переменная опций, отправляемая в то время, когда CheckConsentNeeded имеет значение true ТОЛЬКО В ЭТОЙ ОБЛАСТИ.
  2. Он вносит изменения в параметры => лямбда, а затем отправляет измененную версию параметров в функцию настройки.

1 Ответ

0 голосов
/ 09 января 2019

Сначала я поговорю непосредственно с двумя утверждениями.

  1. Параметр options переменная , который отправлено передан в , в то время как будет иметь значение CheckConsentNeeded, установленное на значение ТОЛЬКО В ЭТОЙ ОБЛАСТИ.

Это происходит «только в этой области», но эта формулировка вводит в заблуждение, поскольку значение свойства не возвращается в какой-то более поздний момент. То, что происходит только в Вегасе (эта область) не остается только в Вегасе, потому что ...

  1. Он вносит изменения в 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). Затем промежуточное программное обеспечение использует свойства этого объекта для настройки его поведения. Значения этих свойств сохранялись уже давно вне контекста, в котором они были назначены.

...