Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从Asp.NETCore';内部访问添加到DI容器的服务;s配置服务方法_C#_Asp.net Core_Dependency Injection - Fatal编程技术网

C# 如何从Asp.NETCore';内部访问添加到DI容器的服务;s配置服务方法

C# 如何从Asp.NETCore';内部访问添加到DI容器的服务;s配置服务方法,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,下面的代码示例来自Startup.cs中的Asp.Net核心ConfigureServices方法 我首先注册一个名为AppState的单例服务。随后,我正在配置OpenIdConnect,在OnTokenValidatedlambda中,我需要访问我刚刚在上面的DI容器中注册的AppState服务 访问AppState服务实例最优雅的方式是什么 如果可能的话,我不想在ConfigureServices方法中调用services.BuildServiceProvider() services.A

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

我首先注册一个名为
AppState
的单例服务。随后,我正在配置OpenIdConnect,在
OnTokenValidated
lambda中,我需要访问我刚刚在上面的DI容器中注册的
AppState
服务

访问
AppState
服务实例最优雅的方式是什么

如果可能的话,我不想在
ConfigureServices
方法中调用
services.BuildServiceProvider()

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();
        }
    };
});
services.AddSingleton();
配置(AzureADB2CDefaults.OpenIdScheme,选项=>
{
options.Events=新的OpenIdConnectEvents
{
OnTokenValidated=异步ctx=>
{
//如何访问AppState的实例,
//它被添加到上面的DI容器中
AppState AppState=/{get from DI};
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();         
                        }
                    };
                }
            });
services.AddOptions(AzureADB2CDefaults.OpenIdScheme)
.配置((选项,sp)=>{
使用(var scope=sp.CreateScope())
{
options.Events=新的OpenIdConnectEvents
{
OnTokenValidated=异步ctx=>
{
var appState=scope.ServiceProvider.GetRequiredService();
等待appState.Dosomething();
}
};
}
});
使用访问当前请求服务提供商并解析服务

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

                //...
            }
        };
    });
服务
.Configure(AzureADB2CDefaults.OpenIdScheme,选项=>{
options.Events=新的OpenIdConnectEvents{
OnTokenValidated=异步ctx=>{
//获取对AppState实例的访问权限,
//它被添加到上面的DI容器中
AppState AppState=ctx.HttpContext.RequestServices
.GetRequiredService();
等待appState.DoSomething();
//...
}
};
});

调用
服务。配置
,将
IConfigureOptions
添加到调用操作方法的服务容器中;


您可以定义自己的
IConfigureOptions实现
并注入任何您喜欢的服务。

您可以从事件上下文访问DI服务:

services.AddSingleton<AppState>();

services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options =>
{
    options.Events = new OpenIdConnectEvents
    {
        OnTokenValidated = async ctx =>
        {
            var appState = (AppState)ctx.HttpContext.RequestServices.GetService(typeof(AppState));
            appState.DoSomething();
        }
    };
});
services.AddSingleton();
配置(AzureADB2CDefaults.OpenIdScheme,选项=>
{
options.Events=新的OpenIdConnectEvents
{
OnTokenValidated=异步ctx=>
{
var appState=(appState)ctx.HttpContext.RequestServices.GetService(typeof(appState));
appState.DoSomething();
}
};
});

@Nkosi谢谢你的回答……请你告诉我我可能做错了什么。我已经用新代码编辑了我的问题,OnTokenValidated不会触发。这帮助我更接近一个类似的问题,但我在这里发现,OnTokenValidated事件似乎只有在我从主页登录到WebApp时才会触发(使用razor时)我正在试图弄清楚,当从任何受保护的页面或资源启动登录过程时,如何启动此命令。