Как получить доступ к сервису, добавленному в контейнер DI изнутри Asp. Net Метод Core ConfigureServices - PullRequest
0 голосов
/ 03 апреля 2020

Пример кода ниже взят из Asp. Net Core ConfigureServices метода в Startup.cs.

Сначала я регистрирую одноэлементную службу с именем AppState. После этого я настраиваю OpenIdConnect, и внутри OnTokenValidated лямбды мне нужен доступ к сервису AppState, который я только что зарегистрировал в контейнере DI выше.

Какой самый элегантный способ доступа к экземпляру службы AppState?

Я бы предпочел не вызывать services.BuildServiceProvider() внутри метода ConfigureServices, если это вообще возможно.

services.AddSingleton<AppState>();

services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options =>
{
    options.Events = new OpenIdConnectEvents
    {
        OnTokenValidated = async ctx =>
        {
            //How to get access to instance of AppState, 
            //which was added to DI container up above
            AppState appState = //{get from DI somehow}; 
            appState.DoSomething();
        }
    };
});

РЕДАКТИРОВАТЬ: Используя ответ ниже, я отредактировал код следующим образом, но Я могу подтвердить, что событие OnTokenValidated не запускается, в отличие от кода выше в моем исходном вопросе, который вызывает:

services.AddOptions<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme)
            .Configure<IServiceScopeFactory>((options, sp) => {
                using (var scope = sp.CreateScope())
                {
                    options.Events = new OpenIdConnectEvents
                    {
                        OnTokenValidated = async ctx =>
                        {
                            var appState = scope.ServiceProvider.GetRequiredService<AppState>();

                            await appState.Dosomething();         
                        }
                    };
                }
            });

Ответы [ 2 ]

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

Вызов services.Configure<T>, добавляет IConfigureOptions<T> к контейнеру службы, который вызывает ваш метод действия; https://github.com/aspnet/Options/blob/master/src/Microsoft.Extensions.Options/OptionsServiceCollectionExtensions.cs#L72

Вы можете определить собственную реализацию IConfigureOptions<T> и внедрить любую услугу, какую захотите.

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

Используйте TokenValidatedContext, чтобы получить доступ к текущему запросу поставщика услуг и разрешить обслуживание

services
    .Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options => {
        options.Events = new OpenIdConnectEvents {
            OnTokenValidated = async ctx => {
                //Get access to instance of AppState, 
                //which was added to DI container up above
                AppState appState = ctx.HttpContext.RequestServices
                    .GetRequiredService<AppState>();
                await appState.DoSomething();

                //...
            }
        };
    });
...