Как убедиться, что объект, возвращаемый из ответа MediatR, и тип возврата метода Web Api имеют одинаковый тип? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть этот метод веб-API и класс

    public async Task<ActionResult<ItemsList<GetJailItemDto>>> GetJailCells([FromBody] JailCellSearchDto jailcellSearchParameters)
    {
        var request = new GetJailCellsQuery()
        {
            JailCellsSearchParameters = jailcellSearchParam
        };
        var response = await _mediator.Send(request).ConfigureAwait(false); //returns Mediatr response object 
        return CreateResponse(response);
    }

    private ObjectResult CreateResponse(MediatRResponse response)
    {
        if (response.IsValid)
        {
            var actionResult = new OkObjectResult(response.ResponseValue);
            return actionResult;
        }
        else
        {
            var objectResult = new ObjectResult(response.ValidationMessages);
            objectResult.StatusCode = 400;
            return objectResult;
        }
    }

public class MediatRResponse
{
    .
    .
    .
    .

    public MediatRResponse(object responseValue)
    {
        Values = responseValue;
        Errors = new List<ErrorItems>();
    }

    public object Values { get; protected set; } //stores items from DB


    public IList<ErrorItems> lErrorItems{ get; set; }

    public bool IsValid
    {
        get
        {
            return !lErrorItems.Any();
        }
    }
}

public class ListItems<T>
{
    public IEnumerable<T> Items { get; set; } //Stores Items
    public int Rows { get; set; }
}

Это успешно выполняется, но мы заметили, что, когда мы заменили тип возврата API с

async Task<ActionResult<ItemsList<GetJailItemDto>>>

на

async Task<ActionResult<int>>

он все еще работает и возвращает элементы

Возможно ли обеспечить безопасность этого типа, учитывая, что mediatr определяет тип ответа во время выполнения?

Я отказался от этого решения, поэтому я попробовал другой appproach

Решение, о котором я подумал, состоит в том, чтобы использовать отражение, чтобы получить тип возврата метода выполнения, который является

Task<ActionResult<ItemsList<GetJailItemDto>>> or Task<ActionResult<int>

, и сравнить его с типом response.Values, который должен возвращать

ItemsList<GetJailItemDto>>

и сравнивать его с универсальным c типом возвращаемого значения метода.

Если тип возвращаемого значения метода равен

async Task<ActionResult<ItemsList<GetJailItemDto>>>

, тогда return 200 OK

, если метод возвращает тип

async Task<ActionResult<int>>

, затем возвращает неверный запрос

Это моя попытка кодировать это

var method = MethodBase.GetCurrentMethod();

var returnType = ((MethodInfo)method).ReturnType; //get return type of executing method

для некоторых причина, по которой он возвращает System.Void вместо этого, вероятно, потому что его asyn * 104 7 *.

есть ли способ получить

ItemsList<GetJailItemDto> type 

от

Task<ActionResult<ItemsList<GetJailItemDto>>>

Лично я предпочитаю безопасное решение, но прибегая к отражению из отчаяния, нужна помощь.

...