C# 如何正确解析ConfigureServices()中的实例?
我使用Auth0的SDK进行身份验证,在他们的SDK中,他们创建了一个事件侦听器,如C# 如何正确解析ConfigureServices()中的实例?,c#,asp.net-core,C#,Asp.net Core,我使用Auth0的SDK进行身份验证,在他们的SDK中,他们创建了一个事件侦听器,如ConfigureServices()中的OnRedirectToIdentityProviderForSignOut() 我需要做一些类似的事情,并添加一些我自己的代码,以便在触发类似事件时对数据库执行一些日志记录和读/写操作 如何解析OnRedirectToIdentityProviderForSignOut()等事件处理程序中的服务? 建议我不要在ConfigureServices()中解析实例,因为a)S
ConfigureServices()
中的OnRedirectToIdentityProviderForSignOut()
我需要做一些类似的事情,并添加一些我自己的代码,以便在触发类似事件时对数据库执行一些日志记录和读/写操作
如何解析OnRedirectToIdentityProviderForSignOut()等事件处理程序中的服务?
建议我不要在ConfigureServices()
中解析实例,因为a)ServiceProvider
将不同于ASP.NET Core在处理请求时使用的实例b)所有实例的生存期是不确定的(根据我的理解)
如何解析Auth0事件处理程序中的实例(例如:OnRedirectToIdentityProviderForSignOut())
,其中的实例将与ASP.NET Core在处理HTTP请求时使用的实例相同,以便在HTTP请求结束时销毁作用域服务
我担心内存泄漏
一些示例代码有助于澄清我的意思(检查注释)
公共类启动{
//...
公共虚拟void配置服务(IServiceCollection服务){
//...
services.AddOpenIdConnect(“Auth0”,选项=>{
options.Events=新的OpenIdConnectEvents
{
OnTicketReceived=异步e=>
{
//此时如何获取我的服务实例(例如:ILogger)?我希望避免调用services.BuildServiceProvider()
//因为它不是ASP.NET核心用于服务HTTP请求的同一个服务提供程序,因此会导致内存泄漏
},
});
}
}
检查预感后,事件代理的事件参数为,您可以通过它访问HttpContext
中的服务提供商
//...
services.AddOpenIdConnect("Auth0", options => {
options.Events = new OpenIdConnectEvents {
OnTicketReceived = async e => {
//How do I get instances of my services (eg: ILogger<Startup>) at this point?
IServiceProvider serviceProvider = e.HttpContext.RequestServices;
var logger = serviceProvider.GetService<ILogger<Startup>>();
//...
},
};
});
//...
/。。。
services.AddOpenIdConnect(“Auth0”,选项=>{
options.Events=新的OpenIdConnectEvents{
OnTicketReceived=异步e=>{
//此时如何获取我的服务实例(例如:ILogger)?
IServiceProvider serviceProvider=e.HttpContext.RequestServices;
var logger=serviceProvider.GetService();
//...
},
};
});
//...
其他事件/处理程序也可以遵循类似的格式
//...
services.AddOpenIdConnect("Auth0", options => {
options.Events = new OpenIdConnectEvents {
OnTicketReceived = async e => {
//How do I get instances of my services (eg: ILogger<Startup>) at this point?
IServiceProvider serviceProvider = e.HttpContext.RequestServices;
var logger = serviceProvider.GetService<ILogger<Startup>>();
//...
},
};
});
//...