gpt4 book ai didi

c# - 使用范围服务的 Hotchocolate 日志记录错误

转载 作者:行者123 更新时间:2023-12-05 04:20:36 24 4
gpt4 key购买 nike

所以我正在尝试使用 HotChocolate 12.5.2 记录错误,我想知道拦截错误的最佳位置。阅读 hotchocolate Documentation 我发现 IErrorFilter 接口(interface)有一个 OnError 方法,每次发生错误时都会调用该方法,但它的实现是单例的。是否有服务范围的某个地方我可以拦截此错误,或者是否有办法将我的 Scoped 服务注入(inject)到 a 中以记录错误?

我可以拦截并个性化我的错误,但我无法注入(inject)我的服务。我只想知道这是否是拦截错误的最佳位置,以及是否是在此处记录错误的最佳做法。

这就是我正在尝试的:

    public class CustomErrorFilter : IErrorFilter
{
private readonly IBaseService _service;
private readonly IHttpContextAccessor _accessor;

public CustomErrorFilter(IBaseService service, IHttpContextAccessor accessor)
{
_service = service;
_accessor = accessor;
}

public IError OnError(IError error)
{
if (error.Exception is not null)
return error.WithMessage(error.Exception.Message);

_service.Add<Log, LogViewModel>(new LogViewModel()
{
Message= error.Message,
}, _accessor.HttpContext.User);

return error;
}
}

IBaseService 是我的通用类,它访问我的应用程序 DbContext 并且是一个 Scoped 服务

最佳答案

尝试注入(inject) IServiceScopeFactory 而不是范围内的依赖项,并在 OnError 处理程序中创建范围和解析依赖项:

public class CustomErrorFilter : IErrorFilter
{
private readonly IServiceScopeFactory _scopeFactory;
//...
public CustomErrorFilter(IServiceScopeFactory scopeFactory, IHttpContextAccessor accessor)
{
_scopeFactory = scopeFactory;
_accessor = accessor;
}

public IError OnError(IError error)
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var service = scope.ServiceProvider.GetRequiredService<IBaseService>();
// use service
}
}
}

关于c# - 使用范围服务的 Hotchocolate 日志记录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74434620/

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