Mediatr другой ответ обработчика в зависимости от логического флага?C#

Место общения программистов C#
Anonymous
Mediatr другой ответ обработчика в зависимости от логического флага?

Сообщение Anonymous »

В моем контроллере я хочу вернуть два разных ответа в зависимости от логического значения includeUsers. Проблема в том, что мой обработчик сейчас возвращает dto BuddyResponse, и я хочу, чтобы он возвращал dto BuddyResponse или BuddyWithUsersResponse dto. Как изменить обработчик и/или его тип возвращаемого значения, чтобы он возвращал то, что я хочу, в зависимости от флага includeUsers? Или мне следует создать два разных обработчика, но тогда мне также нужно будет проверить в действии контроллера, какой запрос отправляет в mediatr?
Код:

Код: Выделить всё

public class Buddy : Entity
{
public User User { get; private set; }
public Guid UserId { get; private set; }
public User MatchedUser { get; private set; }
public Guid MatchedUserId { get; private set; }
public DateTime MatchDateTime { get; private set; }
}

Код: Выделить всё

public record BuddyResponse(Guid Id, Guid UserId, Guid MatchedUserId, DateTime MatchDateTime)

Код: Выделить всё

public record BuddyWithUsersResponse(Guid Id, UserResponse User,UserResponse MatchedUser, DateTime MatchDateTime)

Код: Выделить всё

[HttpGet("{userId:guid}")]
public async Task GetUserBuddies(Guid userId,bool includeUsers = false)
{
var query = new GetUserBuddiesQuery(userId, includeUsers);

var buddiesResult = await mediator.Send(query);

return buddiesResult.Match(
Ok,
Problem);
}

Код: Выделить всё

public record GetUserBuddiesQuery(Guid UserId) : IRequest;

Код: Выделить всё

GetUserBuddiesAsync
из репозитория возвращает Buddy в зависимости от флага includeUsers, кстати.

Код: Выделить всё

public class GetUserBuddiesQueryHandler(IBuddiesRepository buddiesRepository, IMapper mapper)
: IRequestHandler
{
public async Task Handle(GetUserBuddiesQuery query,
CancellationToken cancellationToken)
{
var buddies = await buddiesRepository.GetUserBuddiesAsync(query.UserId, query.IncludeUsers);

return mapper.Map(buddies);
}
}
Я пытался создать базовый класс для обоих ответов, но не могу вернуть, например, BuddyResponse, когда тип возвращаемого обработчика — BaseBuddyResponse. Я попытался создать объект-оболочку:

Код: Выделить всё

public class BuddyResponseWrapper
{
public List? BuddyResponses { get; set; }
public List? BuddyWithUsersResponses { get; set; }
}
но в ответе моего контроллера я бы получил json с обоими вариантами, где один из них всегда равен нулю, поэтому мне также нужно будет добавить некоторую логику в контроллер.

Подробнее здесь: https://stackoverflow.com/questions/791 ... olean-flag

Вернуться в «C#»