私は C# 開発者ですが、cqrs の構造と基本を学びたいので、言語が Java であるかどうかに関係なく、そこにある cqrs に関するほぼすべてのチュートリアルを読みました。
しかし、チュートリアルには違いがあり、今では混乱しており、どのテクニックを使用する必要があるのか わからないため、チュートリアルをたくさん読んだことが問題だと思います.
私の頭の中では 2 つの主要な質問が飛び交っています。
コマンド側では、たとえば ORM を呼び出すロジックをどこに配置すればよいですか? いくつかのチュートリアルでは、コマンド ハンドラーでそれを行います (私にとってはより多くのロジックです)。一部のチュートリアルでは、コマンド ハンドラーによって起動されるイベント ハンドラーでそれを行います。その場合、検証ロジックのみを行います。
イベント ストアと考えを元に戻すには、どのデータをデータベースに保存する必要がありますか。一部のチュートリアルでは集計を保存し、一部のチュートリアルではイベント モデルを保存します。
誰かがどのパターンを使用するのか、そしてその理由を説明してくれることを願っています。おそらく両方とも異なるシナリオで、私にはわかりません。
実際の例は素晴らしいでしょう。(疑似コードのみ)
おそらくユーザー登録、RegisterTheUser コマンド:
やるべきこと:
- ユーザー名がすでに使用されているかどうかを確認する
- ユーザーをデータベースに追加
- 確認メールを送信する (コマンドまたは UserIsRegistered イベントで?)
- イベントConfirmationMailSendedまたはUserIsRegisteredイベントのみを発生させますか?
敬具
編集:これが私の現在の実装です(シンプル)
public class RegisterTheUser : ICommand
{
public String Login { get; set; }
public String Password { get; set; }
}
public class RegisterTheUserHandler : IHandleCommand<RegisterTheUser, AccountAggregate>
{
public void Handle(AccountAggregate agg, RegisterTheUser command)
{
if (agg.IsLoginAlreadyInUse(command.Login))
throw new LoginIsAlreadyInUse();
agg.AddUserAccount(command);
CommandBus.Execute<SendMail>(x => { });
EventBus.Raise<UserIsRegistred>(x => { x.Id = agg.UserAccount.Id; });
}
}
public class UserIsRegistred : IEvent
{
public Guid Id { get; set; }
}
public class AccountAggregate : AggregateBase
{
public AccountAggregate(IUnitOfWork uow)
{
UnitOfWork = uow;
}
private IUnitOfWork UnitOfWork { get; set; }
public UserAccount UserAccount { get; set; }
public void AddUserAccount(RegisterTheUser command)
{
UserAccount = new UserAccount
{
Id = Guid.NewGuid(),
IsAdmin = false,
Login = command.Login,
Password = Crypto.Sha512Encrypt(command.Password)
};
UnitOfWork.UserAccountRepository.Add(UserAccount);
UnitOfWork.Commit();
}
public Boolean IsLoginAlreadyInUse(String login)
{
var result = UnitOfWork.UserAccountRepository.SingleOrDefault(x => x.Login == login);
return (result != null);
}
}