Неизвестное значение дискриминатора "MyEvent"
Использование механизма сохранения MongoDB в https://github.com/joliver/EventStore вызывает ошибку Unknown discriminator value 'MyEvent'
, Проблема возникает только тогда, когда я пытаюсь загрузить все события для воспроизведения событий, как this.storeEvent.Advanced.GetFrom(new DateTime(2010, 1,1))
Проблемы вызваны в ExtensionsMethods.cs
public class MyClassEvent : IDomainEvent { ... }
public static Commit ToCommit(this BsonDocument doc, IDocumentSerializer serializer)
{
if (doc == null)
return null;
var id = doc["_id"].AsBsonDocument;
var streamId = id["StreamId"].AsGuid;
var commitSequence = id["CommitSequence"].AsInt32;
var events = doc["Events"].AsBsonArray.Select(e => e.AsBsonDocument["Payload"].IsBsonDocument ? BsonSerializer.Deserialize<EventMessage>(e.AsBsonDocument["Payload"].AsBsonDocument) : serializer.Deserialize<EventMessage>(e.AsBsonDocument["Payload"].AsByteArray)).ToList();
var streamRevision = doc["Events"].AsBsonArray.Last().AsBsonDocument["StreamRevision"].AsInt32;
return new Commit(
streamId,
streamRevision,
doc["CommitId"].AsGuid,
commitSequence,
doc["CommitStamp"].AsDateTime,
BsonSerializer.Deserialize<Dictionary<string, object>>(doc["Headers"].AsBsonDocument),
events);
}
Моя конфигурация такая:
Wireup.Init()
.UsingMongoPersistence(connectionName, new DocumentObjectSerializer())
.UsingBsonSerialization()
.UsingAsynchronousDispatcher()
.PublishTo(this.container.Resolve<IPublishMessages>())
.Build();
Но перепробовал почти все варианты сериализатора.
2 ответа
Попробуйте зарегистрировать ваши объекты (сами сообщения о событиях, а также темы полезных нагрузок EventStore), используя метод BsonClassMap.RegisterClassMap. Кажется, расширение mongo в EventStore хорошо обрабатывает полезные данные строк, но не десериализованные объекты... по крайней мере, регистрация классифицированных была решением в моем случае.
Я тоже столкнулся с этим. Ответ Zsolt Pardi был хорошей отправной точкой, но в итоге я решил его немного иначе.
Обратите внимание, что я не только получил это, когда myEventStore.Advanced.GetFrom(...)
; myEventStore.OpenStream(...)
также не удается. Это имеет смысл, потому что оба метода используют один и тот же IPersistentStream
и сериализатор.
Я не сталкиваюсь с этой проблемой, когда, когда я впервые сохраняю событие, перед извлечением события того же типа. Видимо MongoDB создает ClassMap
когда его просят сериализовать тип в первый раз.
В любом случае, для меня решение было создать карту классов для всех моих типов событий при запуске приложения. Предполагая, что все типы находятся в сборке SimpleCQRS.Event
и происходят от SimpleCQRS.Event
Я делаю это так:
var types = Assembly.GetAssembly(typeof(SimpleCQRS.Event))
.GetTypes()
.Where(type => type.IsSubclassOf(typeof(SimpleCQRS.Event)));
foreach (var t in types)
BsonClassMap.LookupClassMap(t);
Для меня это работает лучше, чем использование BsonClassMap.RegisterClassMap<TypeToMap>
как предлагает Жолт, потому что для этого требуется универсальный параметр типа, то есть вы должны вручную добавить каждый тип события.