CQRS - Создание BaseCommandHandler с использованием Mediatr в C #, ASP.net Core - PullRequest
0 голосов
/ 28 ноября 2018

Итак, я узнал о Mediatr, созданном Джимми Богардом, и меня поразило, как мы достигли CQRS паттерна, используя Mediatr.

. Я начал внедрять его в свое приложение, а потом понял,что в моем приложении могут быть сотни Entities, и для каждой сущности я не уверен в создании отдельных команд и запросов, что будет прямо противоположно DRY.Поэтому я начал писать базовые команды и обработчики.

public abstract class CreateBaseCommand : IRequest
{    
}

public abstract class DeleteBaseCommand : IRequest
{
}  //... and so on.

и соответствующие обработчики.

public abstract class CreateBaseHandler : IRequestHandler<CreateBaseCommand>
{
}

public abstract class DeleteBaseCommandHandler : IRequestHandler<DeleteBaseCommand>
{
}//... and so on.

Но я понял, что мне все равно понадобятся отдельные команды для моих доменных сущностей, и они будут иметьвыводить из их базовых команд соответственно.

Тогда я думаю, что если я могу просто поместить все команды в одну и иметь только один базовый обработчик.

    public abstract class BaseCommand : IRequest
    { 
       int CommandType
    }

    public abstract class BaseCommandHandler : IRequestHandler<BaseCommand>
    {
       public Task<Unit> Handle(BaseCommand request, CancellationToken cancellationToken)
       {
        if (CommandType == 0)
        {
            // Create entity
        }
        if (CommandType == 1)
        {
            // Update entity
        }//.. and so on
      }
    }

Мне было интересно, есть ли более эффективный способ сделать это, я не очень убежден в идее использования CommandType и наличия одного handle метода для выполнения всех операций CRUD.

Это хороший подход или у меня должен быть отдельный набор команд для каждой сущности домена?

1 Ответ

0 голосов
/ 29 ноября 2018

Технически у вас должна быть отдельная команда для каждого создания.Добавление базы не очень помогает, и усложняет структуру, поэтому я бы от этого избавился.

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

Например, вы пишете систему розничной торговли и создаете новый заказ для зарегистрированного пользователя, и этот заказимеет 5 позиций.Рассматривая это с точки зрения модели данных, вам нужно отправить 1 команду создания для заказа и 5 команд создания для отдельных позиций.Что должно произойти, это отправить одну команду AddNewOrderCommand и обработать ее класс User.Затем метод класса User создает новую строку базы данных заказов и все позиции.То, как вы добавляете порядок (какие строки создавать и т. Д.), Теперь инкапсулировано в методе, к которому он относится, а не в вашей командной архитектуре.

Используете ли вы Domain Driven Design для своего приложения?Если нет, вы должны рассмотреть это, потому что это очень хорошо для сложных систем, и если у вас есть сотни сущностей, шансы хороши, это квалифицируется как сложная система.На языке DDD вышеупомянутый пользователь вызывается, и Aggregate Root, а также Order и Line Item являются просто сущностями.У вас нет команд создания для сущностей, только для совокупных корней.(Обратите внимание, что иногда класс может быть как агрегированным корнем, так и нормальной сущностью в другом агрегированном корне. Почему это происходит и как с ним обращаться, это не входит в сферу охвата этого вопроса)

Просмотрите вашу модель и найдите вещиэто не имеет смысла, если они не принадлежат кому-то еще.Например, позиция из примера выше.Наличие в моей базе данных позиции, не связанной с заказом, не имеет смысла.Поэтому все позиции должны быть созданы по заказам.Иметь заказ без связанного с ним пользователя также не имеет смысла.Поэтому пользователь должен создать заказ.Однако пользователь, похоже, является вершиной пирамиды, поэтому он является совокупным корнем и ему нужна команда Create.

Если вы проанализируете свой домен, вы обнаружите, что вам это почти не нужномного команд создания, и поэтому проблема исчезает.

...