Требуется ли регистрация BsonClassMap для каждого типа событий при настройке сохраняемости mongodb для NEventStore?

При настройке постоянства 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",
        // ..

Мне кажется немного неудобным тот факт, что системы могут работать без регистрации всех типов событий, но выбирают стратегию определения дискриминатора по умолчанию, которая предотвращает это.


person Marijn    schedule 01.08.2012    source источник


Ответы (1)


Я столкнулся с такой же ситуацией. На данный момент я выполняю регистрацию BSON так же, как вы описали. Меня не беспокоит, что система выполняет эту регистрацию при запуске.

Кроме того, я держу свои классы событий и команд в отдельном проекте от фактической логики предметной области, поскольку затем я могу «делиться» структурами классов как в серверных, так и в клиентских проектах.

person James Bradt    schedule 11.09.2012