Неизвестное значение дискриминатора «MyEvent» - PullRequest
8 голосов
/ 17 сентября 2011

Использование механизма сохранения MongoDB в 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 ]

13 голосов
/ 31 июля 2012

Я тоже столкнулся с этим. Ответ Zsolt был хорошей отправной точкой, но я решил немного его изменить.

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

10 голосов
/ 17 сентября 2011

Попробуйте зарегистрировать ваши объекты (сами сообщения о событиях, а также темы полезных нагрузок EventStore), используя метод BsonClassMap.RegisterClassMap.Кажется, расширение mongo в EventStore хорошо обрабатывает строковые данные, но не десериализованные объекты ... по крайней мере, регистрация классифицированных была решением в моем случае.

...