【问题标题】:Hotchocolate logging errors with a scoped serviceHotchocolate 使用范围服务记录错误
【发布时间】:2022-11-15 04:27:07
【问题描述】:

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

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

这就是我正在尝试的:

    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 服务

【问题讨论】:

    标签: c# hotchocolate


    【解决方案1】:

    尝试注入 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
            }
       }
    }
    

    【讨论】:

    • 这正是我所需要的! Ty 非常感谢快速和好的答案。
    • @HumbertoFilho 很乐意提供帮助!
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多