c# - 如何从 Asp.Net Core 的 ConfigureServices 方法内部访问添加到 DI 容器的服务

标签 c# asp.net-core dependency-injection

下面的代码示例来自 Asp.Net Core ConfigureServices Startup.cs 中的方法。

我首先注册一个名为 AppState 的单例服务.之后,我正在配置 OpenIdConnect,并在 OnTokenValidated 里面lambda,我需要访问 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();         
                        }
                    };
                }
            });

最佳答案

使用 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();

                //...
            }
        };
    });

关于c# - 如何从 Asp.Net Core 的 ConfigureServices 方法内部访问添加到 DI 容器的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61003307/

相关文章:

c# - 一台服务器上 ASP.NET 站点的最大数量/限制

c# - MediatR 和 SimpleInjector 的依赖范围问题

c# - 使用 Roslyn 检测 c# 6 功能

c# - 如何获取 IMemoryCache 中 key 的 AbsoluteExpiration DateTimeOffset

http - ASP.NET Core 响应缓存未按预期工作

dependency-injection - lombok 和 guice 注入(inject)

c# - 我可以将多维数据绑定(bind)到 C# 和 .NET 中的 DataGridView 吗?

c# - 如何自动增加 .NET Core 项目的版本(例如 “1.0.*” )?

c# - 直接在函数方法中注入(inject) DI 实例 (Azure Functions)

asp.net-core - 如何在 ASP.NET Core 3.1 中使用简单注入(inject)器进行依赖交换以进行集成测试