在ServiceStack请求过滤器中解析具有泛型类型的接口

时间:2016-09-07 16:42:12

标签: c# .net dependency-injection servicestack inversion-of-control

我的问题是 - 是否可能,如果是 - 如何解决ServiceStack请求过滤器中使用泛型类型的接口,并且从请求的 DTO 动态检索类型。我的想法是我在程序集中定义了多个验证器,并且它们使用具有泛型类型的接口。例如:

AddressSaveValidator : BaseValidator<AddressSaveRequest>;

我的目标是根据请求解析并查看请求是否具有为此类请求定义的验证程序,然后验证然后记录结果。唯一的问题是我不知道如何解析泛型类型的接口。这是我将如何使用它的示例:

        RequestFilters.Add((req, res, dto)  =>
        {
            var validator = container.Resolve<IValidator<typeof(dto)>>();
            var  validatorResult = validator.Validate(dto);
            if(validatorResult.IsValid)
            {
                var logger = container.Resolve<ILogger>();
                var result = logger.LogValidationResults(validationResult);
                throw ValidationException(result);
            }
        });

当然,它不起作用。

1 个答案:

答案 0 :(得分:2)

您可以使用IValidator解决ValidatorCache.GetValidator()请求,但不能在GlobalRequestFilters中抛出异常,您需要将错误直接写入响应,例如:

var validator = ValidatorCache.GetValidator(req, dto.GetType());
using (validator as IDisposable)
{
    var validatorResult = validator.Validate(dto);
    if (validatorResult.IsValid) return;

    var errorResponse = DtoUtils.CreateErrorResponse(dto, validatorResult.ToErrorResult());

    res.WriteToResponse(req, errorResponse);
}