C# 如何从Asp.NETCore';内部访问添加到DI容器的服务;s配置服务方法
下面的代码示例来自Startup.cs中的Asp.Net核心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
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时)我正在试图弄清楚,当从任何受保护的页面或资源启动登录过程时,如何启动此命令。