Пример кода ниже взят из 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();
}
};
}
});