Oliver の EventStoreにmongodb の永続性を設定する場合BsonClassMap
、イベントの種類ごとに登録する必要がありますか? これを行わないと、例外が発生しますUnknown discriminator value 'InventoryItemCreated'
。ここで説明したように、すべてのイベント タイプを MongoDB に登録し、イベント ストアを構成します。
var types = Assembly.GetAssembly(typeof(SimpleCQRS.Event))
.GetTypes()
.Where(type => type.IsSubclassOf(typeof(SimpleCQRS.Event)));
foreach (var t in types)
BsonClassMap.LookupClassMap(t);
var store = Wireup.Init()
.UsingMongoPersistence("mongo", new DocumentObjectSerializer())
.UsingSynchronousDispatchScheduler()
.DispatchTo(new DelegateMessageDispatcher(DispatchCommit))
.Build();
これは本当にやるべきことですか?
MongoDB の永続性を備えた Oliver のイベント ストアをサポートするために Greg Young の「最も単純なもの」を変更しているときに、この問題に遭遇しました。コードは github にあります。
関連する観察結果 (tldr)
イベント タイプを登録しない場合は、空のイベント ストアから開始できます (イベントを逆シリアル化する必要がないため)。1 つのインベントリ アイテムを追加でき、イベント ストアには 1 つのコミットがあります。
/* 0 */
{
"CommitId" : new BinData(3, "4iXrzvzNYEyKmGweCKkOVQ=="),
"CommitStamp" : ISODate("2012-08-01T08:08:35.795Z"),
"Dispatched" : true,
"Events" : [{
"StreamRevision" : 1,
"Payload" : {
"Headers" : { },
"Body" : {
"_t" : "InventoryItemCreated",
"Version" : 0,
"_id" : new BinData(3, "36qvklv+xU2+mDhVUlzmBg=="),
"Name" : "abc"
}
}
}],
"Headers" : { },
"_id" : {
"StreamId" : new BinData(3, "36qvklv+xU2+mDhVUlzmBg=="),
"CommitSequence" : 1
}
}
アプリケーションを再起動してこの単一のイベントを再生するとPayLoad.Body
、Unknown discriminator value 'InventoryItemCreated'
.
InventoryItemCreated
イベントを正常に再生する別の方法を 2 つ見つけました。
- 再生する前に別のインベントリ アイテムを作成すると、すべてのイベントを再生できます。どうやらMongoDBはディスクリミネーターを知っています。
- 識別子を完全な型名に手動で変更します。
/* 0 */
{
// ..
"Events" : [{
"StreamRevision" : 1,
"Payload" : {
"Headers" : { },
"Body" : {
"_t" : "SimpleCQRS.InventoryItemCreated, SimpleCQRS",
// ..
システムがすべてのイベント タイプを登録しなくても機能するように見えるのに、これを防ぐデフォルトの識別子決定戦略を選択するのは少し気まずい気がします。