【发布时间】:2015-01-05 11:28:01
【问题描述】:
我有一个关于 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();
}
}
在这两个命令中,我都根据用户的电子邮件地址检索用户。现在,如果我想在查询数据库之前修剪 UI 输入,我必须在两个地方进行更改。
我当然可以创建一个 UserRepository,例如,有一个 GetUserByEmailAddress 方法并将该 IUserRepository 插入到我的 CommandHandlers 的构造函数中。但是,这最终不会创建一个包含 Save、GetById、GetByUsername 等的“上帝存储库”吗?
如果我创建一个存储库,为什么要创建单独的 Query 对象?
如何保持此代码干燥?
【问题讨论】:
标签: repository dry cqrs duplication