Наилучшая практика для выполнения последовательных команд / запросов MediatR как части одного HTTP-запроса? - PullRequest
0 голосов
/ 01 марта 2019

Я нахожусь в ситуации, когда создание сущности требует создания и идентификатора других сущностей, однако я не уверен, как это лучше всего реализовать с использованием MediatR .

Например, скажем, у меня есть объект User ...

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
    public ICollection<Submission> Submissions { get; set; }
}

объект Submission ...

public class Submission
{
    public int Id { get; set; }
    public string Reference { get; set; }
    public User User { get; set; }
    public ICollection<QuestionsAndAnswer> QuestionAndAnswers { get; set; }
}

и объект QuestionAndAnswer.

public class QuestionAndAnswer
{
    public int ID { get; set; }
    public string Question { get; set; }
    public string Answer { get; set; }
    public Submission { get; set; }
}

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

В этом случае пользователь прошел через ряд вопросов, предоставил ответы, заполненные в окончательной форме, котораяпредоставляет запрашивает их контактные данные, а затем представил информацию в API.На данный момент, я не уверен, как обрабатывать данные с помощью MediatR, потому что пользователь должен быть создан, и его идентификатор должен быть возвращен в результате для создания объекта представления, который, в свою очередь, необходим для сохранения вопросов и ответов.

Должен ли я реализовать команду, которая называется CreateUserWithSubmissionQuestionAndAnswersCommand, обработчик которой каким-то образом затем вызывает обработчики для трех отдельных команд и выполняет их по порядку, и если да, то как?

Я простоПотерял немного о том, как реализовать этот сценарий как единый HTTPRequest без нарушения CQRS.Единственный другой способ, о котором я мог подумать, это реализовать отдельные конечные точки, которые выполняют каждую из этих задач индивидуально, что требует от клиента совершать и принимать три отдельных вызова подряд (CreateUser, CreateSubmission, CreateQuestionAndAnswer)?

У кого-нибудь есть какие-либо идеи?

1 Ответ

0 голосов
/ 01 марта 2019

Я обычно моделирую пользовательские взаимодействия / истории пользователей как запросы MediatR.В большинстве случаев это означает сопоставление одного HTTP-запроса с одним запросом MediatR.

В вашем случае это будет один запрос, который инкапсулирует обработку представления (й), например ProcessSubmissions.Этот запрос будет содержать свойства для пользователя, а также отправку (и) и связанные пары вопрос / ответ.Тогда один обработчик сохранит отдельные объекты в правильном порядке.

Для полноты, это то, как это решение могло бы выглядеть:

public class ProcessSubmission : IRequest
{
    public User User { get; set; }

    public ICollection<Submission> Submissions { get; set; }
}

public class ProcessSubmissionHandler : IRequestHandler<ProcessSubmission>
{
    public async Task<Unit> Handle(ProcessSubmission request, CancellationToken cancellationToken)
    {
        // Persist the user in the database
        var userId = PersistTheUser(request.User);

        foreach (var submission in request.Submissions)
        {
            // Persist each submission with questions and answers
        }
    }
}
...