Неизвестное значение дискриминатора "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> как предлагает Жолт, потому что для этого требуется универсальный параметр типа, то есть вы должны вручную добавить каждый тип события.

Другие вопросы по тегам