未知的鉴别器值'MyEvent'

Jac*_*cee 8 event-sourcing event-store mongodb-.net-driver

joliver/EventStore中使用MongoDB persistance引擎导致错误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);
    }
Run Code Online (Sandbox Code Playgroud)

我的配置是这样的:

 Wireup.Init()                
            .UsingMongoPersistence(connectionName, new DocumentObjectSerializer())
            .UsingBsonSerialization()    
            .UsingAsynchronousDispatcher()                                
            .PublishTo(this.container.Resolve<IPublishMessages>())
            .Build();
Run Code Online (Sandbox Code Playgroud)

但是已经尝试过几乎所有类型的串行器选项.

Mar*_*ijn 13

我也碰到了这个.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);
Run Code Online (Sandbox Code Playgroud)

对我来说,这比使用BsonClassMap.RegisterClassMap<TypeToMap>Zsolt建议更好,因为这需要一个泛型类型参数,这意味着你必须手动添加每个事件类型.


小智 10

尝试使用BsonClassMap.RegisterClassMap方法注册您的对象(本身就是事件消息以及EventStore有效负载的主题).似乎EventStore的mongo扩展很好地处理字符串有效负载,但不是反序列化的对象......至少注册分类是我的解决方案.

  • 谢谢.当我保存提交时,mongo db驱动程序自己注册了类,但是在回复(纯读取)时,映射没有完成. (2认同)