cqrs とイベント ソーシングを使用して構築されたアプリケーションのデータソースとして MongoDb を使用しています。今日直面した問題は、データベースを読み取るためのイベントのマッピング (非正規化) を実装する最良の方法は何かということです。たとえば、ユーザーに関するすべての情報を含むユーザー MongoDb コレクションがあります。次のようなイベントがあります。
[Serializable]
public class PasswordChangedEvent : DomainEvent
{
private string _hashedPassword;
private string _salt;
public PasswordChangedEvent()
{
}
public PasswordChangedEvent(string hashedPassword, string salt, DateTime createdDate)
:base(createdDate)
{
HashedPassword = hashedPassword;
Salt = salt;
}
public string HashedPassword
{
private set { _hashedPassword = value; }
get { return _hashedPassword; }
}
public string Salt
{
private set { _salt = value; }
get { return _salt; }
}
}
そして、DTOのように読んでください
public class User : BaseReportDataObject
{
public string Name { get; set; }
public string Email { get; set; }
public string Gender { get; set; }
public DateTime? BirthDate { get; set; }
public string HashedPassword { get; set; }
public string Salt { get; set; }
public string RestoreHash { get; set; }
public string OpenIdIdentifyer { get; set; }
}
イベントでドキュメントを更新するための現在のソリューションは次のようになります。イベント用のマッピング コード (BsonClassMap.RegisterClassMap など) と更新用のコードがあります。
MongoCollection.Update(Query<PasswordChangedEvent>.EQ(ev => ev.AggregateId, evnt.AggregateId),
Update<PasswordChangedEvent>
.Set(ev => ev.HashedPassword, evnt.HashedPassword)
.Set(ev => ev.Salt, evnt.Salt));
このコードは私には少し見苦しく冗長に見えます。すべてのラムダ要素を使用しても、プロパティ値を明示的に提供する必要があります。もう 1 つの方法は、PasswordChangedEvent を User dto に置き換えることです。そのため、イベント マッピングはもう必要ありません。
MongoCollection.Update(Query<ReadDto.User>.EQ(u => u.Id, evnt.AggregateId),
Update<ReadDto.User>.Set(u => u.HashedPassword, evnt.HashedPassword));
もう一度質問します。そのようなタイプのマッピングを行うためのより良い方法はありますか? 同じ mongo db コレクションにマップされた 2 種類のオブジェクト (イベントと DTO)。