При настройке постоянства mongodb для EventStore Oliver требуется ли регистрация 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, код находится на github.
Некоторые связанные наблюдения (tldr)
Если я не регистрирую типы событий, я могу начать с пустого хранилища событий (поскольку события не нужно десериализовать). Я могу добавить один элемент инвентаря, и в моем магазине событий есть одна фиксация:
/* 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
:
- Когда я создаю другой элемент инвентаря перед воспроизведением, я могу воспроизвести все события; очевидно, тогда MongoDB знает о дискриминаторе.
- Вручную измените дискриминатор на полное имя типа:
/* 0 */
{
// ..
"Events" : [{
"StreamRevision" : 1,
"Payload" : {
"Headers" : { },
"Body" : {
"_t" : "SimpleCQRS.InventoryItemCreated, SimpleCQRS",
// ..
Мне кажется немного неудобным тот факт, что системы могут работать без регистрации всех типов событий, но выбирают стратегию определения дискриминатора по умолчанию, которая предотвращает это.