英文:
How to inject dependency into InvalidModelStateResponseFactory delegate?
问题
public interface IErrorHandlingService
{
MyErrorResponse ErrorResponse { get; }
void AddRequestInformation(Guid trace, DateTime timestamp, string requestRoute);
void AddError(MyCustomError error);
bool HasErrors();
}
我有一个作用域服务,用来处理我的应用程序中的所有错误,以及我想要作为错误响应的一部分返回的附加信息。当错误被引发时,我将它们添加到这个服务中,并且由于它是作用域的,它会跟踪特定请求的所有错误,并允许我在代码的各个点忽略或返回它们。
我希望通过这个服务处理任何模型绑定错误,以保持我的错误响应的格式一致。我可能有点儿愚蠢地假设 InvalidModelStateResponseFactory
是一个委托,它将在单个请求失败模型绑定验证时调用,那么我应该如何将我的作用域错误处理程序传递给它,以便在该函数中使用它?这是否可能?
我的直觉是在 services.Configure<ApiBehaviorOptions>(...)
调用内部分配它,但我无法找到在其中访问我的服务的“正确”方法。
services.Configure<ApiBehaviorOptions>(options =>
{
options.InvalidModelStateResponseFactory = (actionContext) =>
{
var errHandler = // ???
var errors = actionContext.ModelState
.Where(e => e.Value.Errors.Count > 0)
.Select(e => e.Value);
foreach (var error in errors)
{
errHandler.AddError(new MyCustomError()
{
// 任何内容
});
}
return new BadRequestObjectResult(errors);
};
});
请注意,你需要找到一种方法来获取 IErrorHandlingService
的实例并分配给 errHandler
变量,这取决于你的应用程序的依赖注入配置。
英文:
I have a Scoped service that handles all errors in my application, along with supplementary info I want to return as part of my error response. As errors are raised I add them to this service and as it is scoped it keeps track of all errors for a particular request and allows me to ignore or return them at various points in my code.
public interface IErrorHandlingService
{
MyErrorResponse ErrorResponse { get; }
void AddRequestInformation(Guid trace, DateTime timestamp, string requestRoute);
void AddError(MyCustomError error);
bool HasErrors();
}
I want to handle any model binding errors via this service to keep the format of my error responses consistent. I've made the (possibly silly) assumption that InvalidModelStateResponseFactory
is a delegate that would be called at the point of a single request failing the model binding validation, so how would I pass my scoped error handler to this in order to use it in the function? Is this possible?
My instinct is to assign it inside the services.Configure<ApiBehaviorOptions>(...)
call but I can't work out the "right" way to access my service inside there.
services.Configure<ApiBehaviorOptions>(options =>
{
options.InvalidModelStateResponseFactory = (actionContext) =>
{
var errHandler = // ???
var errors = actionContext.ModelState
.Where(e => e.Value.Errors.Count > 0)
.Select(e => e.Value);
foreach (var error in errors)
{
errHandler.AddError(new MyCustomError()
{
// whatever
});
}
return new BadRequestObjectResult(errors);
};
});
答案1
得分: 1
我可以通过actionContext.HttpContext.RequestServices
访问服务,所以在我上面示例中分配errHandler
的那一行将是:
var errHandler = (IErrorHandlingService)actionContext.HttpContext.RequestServices.GetService(typeof(IErrorHandlingService));
英文:
Managed to find the answer before I'd even finished writing the question - I can access the services via actionContext.HttpContext.RequestServices
so the line in my example above where I assign the errHandler
would be:
var errHandler = (IErrorHandlingService)actionContext.HttpContext.RequestServices.GetService(typeof(IErrorHandlingService));
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论