我有一個關於在的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();
}
}
在這兩個命令中,我根據他的電子郵件地址檢索用戶。現在,如果我想在查詢數據庫之前修剪UI輸入,我將不得不在兩處改變它。
我當然可以創建一個UserRepository,它將例如具有GetUserByEmailAddress方法並將該IUserRepository插入到我的CommandHandlers的構造函數中。然而,這不會最終創建一個「神倉庫」與保存,GetById,GetByUsername等?
如果我創建了一個信息庫,爲什麼創建單獨的查詢對象?
一個如何去維持這段代碼DRY?
不會重構命令處理程序來實現多個接口只是創建一個「神」命令處理程序,而不是一個臃腫的存儲庫? – user4419743
我喜歡第二部分。也許創建一個擴展方法。例如: 'public static IQueryable WithEmailAddress(this IQueryable source,string emailaddress)' –
user4419743