У меня есть модели, определенные как показано ниже (я опустил части, не связанные напрямую с проблемой):
public class AnObjectWithState {
public AbstractState State { get; private set; }
}
public abstract class AbstractState {
public State Representation { get; protected set; }
}
public enum State {
State1,
State2,
State3
}
И код сериализатора:
public class AbstractStateSerializer : SerializerBase<AbstractState>
{
public override AbstractState Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) =>
StateFactory.CreateFor(base.Deserialize(context, args));
}
И этот код - то, что я используйте для регистрации сериализатора:
cm.MapField(c => c.State).SetSerializer(new AbstractStateSerializer());
Теперь, когда я запускаю запрос на подсчет снова моего экземпляра MongoDB, я получаю сообщение об ошибке:
System.InvalidOperationException: Convert ({ document} {State} .Representation, Int32) не поддерживается.
Очевидно, что виноват сериализатор, потому что когда я удаляю вызов SetSerializer
, все работает нормально. Вы можете сказать, что то, что я делаю, выглядит странно, однако, пожалуйста, поймите, что приведенная выше реализация AbstractState
является минимальной версией - на самом деле она содержит немного больше кода, и этот код необходимо инициализировать так, как MongoDB не может работать. Моя цель здесь состоит в том, чтобы иметь чистый агрегат - содержащий только бизнес-логику c, а не строительную логику c. Вот почему я предпочел бы иметь некоторый инфраструктурный код (например, этот пользовательский сериализатор) для инициализации объекта состояния. Любые идеи о том, как заставить это работать?