ドメインイベントについて詳しく調べていますが、履歴上の理由から、エンティティの更新を永続化するためのアドバイスが必要です。私の例では、ユーザーエンティティとサインインを扱います。
public class UserService
{
private UserRepository _repository;
public UserService()
{
_repository = new UserRepository();
}
public User SignIn(string username, string password)
{
var user = _repository.FindByUsernameAndPassword(username, password);
//As long as the found object is valid and an exception has not been thrown we can raise the event.
user.LastLoginDate = DateTime.Now;
user.SignIn();
return user;
}
}
public class User
{
public User(IEntityContract entityContract)
{
if (!entityContract.IsValid)
{
throw new EntityContractException;
}
}
public Guid Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public DateTime LastLoginDate { get; set; }
public void SignIn()
{
DomainEvent.Raise(new UserSignInEvent() {User = this});
}
}
public class UserSignInEvent : IDomainEvent
{
public User User { get; set; }
}
public class UserSignInHandler : Handles<UserSignInEvent>
{
public void Handle(UserSignInEvent arguments)
{
//do the stuff
}
}
ですから、私がやっていることがあるところでは、UserオブジェクトLastLoginDateを更新し、歴史的な理由でユーザーがログインした日時をログに記録したいと思います。私の質問は、リポジトリとコンテキストの新しいインスタンスを作成して、ハンドラーに変更を保存するか、イベントに何かを渡すかです。これが私が今苦労していることです。