У меня вопрос о дублировании кода в командной части принципа CQRS.Кодирование кода CQRS в командах
Были следующие статьи из:
https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91 https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92
Мне кажется, что такой подход разделения каждой команды в своем собственном классе собирается дать некоторый код дублирование при извлечении объектов из данных магазин.
Немного надуманный, возможно, скажем, например, у меня есть команда, где я хочу сбросить пароль пользователя с учетом его адреса электронной почты и команды, в которой я хочу обновить последнюю дату входа пользователя .
public class ResetPasswordCommandHandler : CommandHandler<ResetPasswordCommand>
{
public override void Execute(ResetPasswordCommand command)
{
**// duplication here**
var user = from c in db.Users
where c.EmailAddress = command.EmailAddress
select c;
user.EmailAddress = command.EmailAddress;
...
db.Save();
}
}
public class UpdateLastLoginCommandHandler : CommandHandler<UpdateLastLoginCommand>
{
public override void Execute(UpdateLastLoginCommand command)
{
**// duplication here**
var user = from c in db.Users
where c.EmailAddress = command.EmailAddress
select c;
user.LastLogin = DateTime.Now;
...
db.Save();
}
}
В обеих командах я получаю пользователя на основании его адреса электронной почты. Теперь, если я хотел бы обрезать вкладку пользовательского интерфейса перед тем, как запросить базу данных, мне пришлось бы изменить это в двух местах.
Я мог бы создать UserRepository, который, например, должен иметь метод GetUserByEmailAddress и вставить этот IUserRepository в конструктор моих CommandHandlers. Однако не создаст ли это «репозиторий богов» с помощью Save, GetById, GetByUsername и т. Д.?
И если я создаю репозиторий, зачем создавать отдельные объекты запроса?
Как можно сохранить этот код СУХОЙ?
Не рефакторинг обработчика команд для реализации нескольких интерфейсов просто создаст обработчик команд «Бог», а не раздутый репозиторий? – user4419743
Мне нравится вторая часть. Возможно, создайте метод расширения. Что-то вроде: 'public static IQueryable WithEmailAddress (этот IQueryable источник, строка emailaddress)' –
user4419743