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# 如何正确解析ConfigureServices()中的实例?_C#_Asp.net Core - Fatal编程技术网

C# 如何正确解析ConfigureServices()中的实例?

C# 如何正确解析ConfigureServices()中的实例?,c#,asp.net-core,C#,Asp.net Core,我使用Auth0的SDK进行身份验证,在他们的SDK中,他们创建了一个事件侦听器,如ConfigureServices()中的OnRedirectToIdentityProviderForSignOut() 我需要做一些类似的事情,并添加一些我自己的代码,以便在触发类似事件时对数据库执行一些日志记录和读/写操作 如何解析OnRedirectToIdentityProviderForSignOut()等事件处理程序中的服务? 建议我不要在ConfigureServices()中解析实例,因为a)S

我使用Auth0的SDK进行身份验证,在他们的SDK中,他们创建了一个事件侦听器,如
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>>();

            //...
        },
    };
});

//...