Откуда этот C# контекст HttpContext в Startup.cs? - PullRequest
0 голосов
/ 19 апреля 2020

Итак, я наткнулся на этот пример кода RazorPages

    using Microsoft.AspNetCore.Mvc;

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        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;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

и у меня вопрос: откуда взялся context ? Я смотрю на

options => { ... } 

как на функцию анонимного делегата с частью слева от лямбда-оператора, а options, являющийся параметром, который передается в блок выражения, где context является. Но контекст не отображается нигде в Startup.cs, и компилятор, похоже, не возражает, когда я комментирую

using Microsoft.AspNetCore.Mvc;

Is. Net, что делает что-то прозрачно за кулисами, чтобы обеспечить context to options.CheckConsentNeeded, и если бы я написал это заявление вручную, как бы я узнал, что context доступен и откуда он берется?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

CheckConsentNeeded свойство принимает делегата Func<HttpContext, bool>.

Func<HttpContext, bool> в C# может представлять метод, который принимает параметр HttpContext и возвращает bool значение.

bool MyFunction(HttpContext context)
{
}

В вашем случае вы присвоили свойству лямбда-выражение , а context представляет параметр типа HttpContext. context - это имя, вы можете изменить его на другое имя, например ctx, c et c.

Вам не нужно добавлять using использовать context, но если вы используете его тип HttpContext в своем коде, вы должны использовать using.

Чтобы разрешить использование типов в пространстве имен

Во время выполнения, когда вызывающий делегат, скорее всего в промежуточном программном обеспечении, вызывает делегата, он передает экземпляр HttpContext в качестве параметра в делегат, назначенный свойству CheckConsentNeeded.

0 голосов
/ 19 апреля 2020

Configure позволяет вам перейти в лямбду, чтобы настроить ваши параметры. Взгляните на этот надуманный пример, чтобы объяснить, что происходит.

// we have an options class that will hold all the props to configure
// our coolie policy
public class Options
{
    public bool UseConsent { get; set; }
}

// this emulates the signature for services.Configure. It takes a lambda
// and simply executes it, enabling the caller to manage the settings
public static void Configure(Action<Options> callback)
{
    //create new options instance
    var options = new Options();
    // allow caller to access this instance and set properties
    callback(options);
    Console.WriteLine(options.UseConsent); // this will print true
}


public static void Main()
{
    Configure(options =>
    {
        options.UseConsent = true;
    });
    Console.ReadLine();
}

Как видите, нигде не происходит маги c, причина, по которой вы можете устанавливать параметры или нет, заключается в том, что Configure перегружен, что позволяет вам перейти в лямбду или нет.

...