3

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)。

4

1 に答える 1

1

これは実際には、あるオブジェクトから別のオブジェクトへのデータのマッピングに関する質問のようです。その場合は、DittoAutoMapperなどの使用を検討することをお勧めします。私はdittoの開発者であり、多くのCQRSシステムで効果的に使用しています...同じビューモデルへの多数の異なるオブジェクトのデータの混合を処理するために作成しました。これらはOOマッパーと呼ばれ、通常、何らかの形式のブートストラップ構成コードがあり、多くの場合、すべての冗長性を回避するために賢明な規則を使用します。

于 2012-10-09T01:53:51.077 に答える