gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:42:17 26 4
gpt4 key购买 nike

我正在使用 Auth0 的 SDK 进行身份验证,并在他们的 sample code 中使用,他们在 ConfigureServices() 中创建了一个事件监听器,例如 OnRedirectToIdentityProviderForSignOut()

我需要做一些类似的事情,并添加一些我自己的代码,这些代码会在触发此类事件时执行一些日志记录和读取/写入数据库。

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

A comment like this one建议我不要解析 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
},
});
}
}

最佳答案

经过预感,事件委托(delegate)的事件参数是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>>();

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

//...

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

关于c# - 如何正确解析 ConfigureServices() 中的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57338569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com