Вам нужно немного изменить вещи.
Прежде всего, вы должны добавить абстрактное свойство get-only
к вашему ResultTypeToFormat
, чтобы определить, какой тип ObjectResult
должен обрабатывать каждая реализация:
public abstract class ResponseFormatter
{
public abstract Type ResultTypeToFormat { get; }
public abstract void ContextResult(ResultExecutingContext context);
}
И, соответственно, вы должны изменить реализации, как показано ниже:
public class OkResultFormatter : ResponseFormatter
{
public override Type ResultTypeToFormat => typeof(OkObjectResult);
public override void ContextResult(ResultExecutingContext context)
{
context.Result = new JsonResult(new ReturnResult(HttpStatusCode.OK));
}
}
public class BadRequestResultFormatter : ResponseFormatter
{
public override Type ResultTypeToFormat => typeof(BadRequestObjectResult);
public override void ContextResult(ResultExecutingContext context)
{
// Perform other bad request stuff here ...
context.Result = new JsonResult(new ReturnResult(HttpStatusCode.BadRequest));
}
}
С этими изменениями теперь вы должны зарегистрировать все средства форматирования результатов в вашем контейнере DI следующим образом:
services.AddScoped<ResponseFormatter, OkResultFormatter>();
services.AddScoped<ResponseFormatter, BadRequestResultFormatter>();
Наконец, вы можете динамически форматировать результаты в своем Атрибуте фильтра :
public class CustomResultFilterAttribute : ActionFilterAttribute
{
private readonly IEnumerable<ResponseFormatter> _responseFormatters;
public CustomResultFilterAttribute(IEnumerable<ResponseFormatter> responseFormatters)
{
_responseFormatters = responseFormatters;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
Type resultType = context.Result.GetType();
ResponseFormatter appropriateFormatter = _responseFormatters
.Single(formatter => formatter.ResultTypeToFormat == resultType);
appropriateFormatter.ContextResult(context);
}
}
Вот также пример проекта в Github: Пример проекта