Пример кода ниже взят из метода Asp.Net Core ConfigurationServices в Startup.cs.
Сначала я регистрирую одноэлементную службу под названием AppState. После этого я настраиваю OpenIdConnect, и внутри лямбды OnTokenValidated мне нужно получить доступ к службе AppState, которую я только что зарегистрировал в контейнере DI выше.
Какой самый элегантный способ доступа к экземпляру службы AppState?
Я бы предпочел не вызывать Services.BuildServiceProvider() внутри метода ConfigurationServices, если это вообще возможно.
services.AddSingleton();
services.Configure(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(AzureADB2CDefaults.OpenIdScheme)
.Configure((options, sp) => {
using (var scope = sp.CreateScope())
{
options.Events = new OpenIdConnectEvents
{
OnTokenValidated = async ctx =>
{
var appState = scope.ServiceProvider.GetRequiredService();
await appState.Dosomething();
}
};
}
});
Подробнее здесь: https://stackoverflow.com/questions/610 ... es-configu