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

bur*_*1ce 3 c# asp.net-core

我使用 Auth0 的 SDK 进行身份验证,并且在他们的示例代码中,他们创建了一个事件侦听器,例如OnRedirectToIdentityProviderForSignOut()ConfigureServices().

我需要做一些类似的事情,并添加一些我自己的代码,当这样的事件被触发时,这些代码会对数据库进行一些日志记录和读/写操作。

如何在 OnRedirectToIdentityProviderForSignOut() 等事件处理程序中解析服务?

像这样的评论表明我不解析实例,ConfigureServices()因为 a) 这ServiceProvider将与 ASP.NET Core 在处理请求时使用的不同 b) 所有实例的生命周期都是不确定的(根据我的理解)

如何在我的 Auth0 事件处理程序中解析实例(例如:OnRedirectToIdentityProviderForSignOut())它与 ASP.NET Core 在处理 HTTP 请求时使用的实例相同,以便在 HTTP 请求结束时销毁作用域服务?

我担心内存泄漏。

一些示例代码来帮助澄清我的意思(检查评论)

public class Startup {
    //...
    public virtual void ConfigureServices(IServiceCollection services) {
        //...
        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? I want to avoid calling services.BuildServiceProvider()
                        //because it won't be the same service provider that ASP.NET Core will use to service HTTP request and thus will cause memory leaks
                    },
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 5

检查预感后,事件委托的事件参数是TicketReceivedContext Class它可以让您访问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>>();

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

//...
Run Code Online (Sandbox Code Playgroud)

其他事件/处理程序也可以遵循类似的格式