Как RegisterClassMap для всех классов в пространстве имен для MongoDb?

на MongoDB драйвер учебник предлагает зарегистрировать карты классов в automap через

BsonClassMap.RegisterClassMap<MyClass>();

Я хотел бы автоматизировать все классы данного пространства имен без явной записи RegisterClassMap для каждого класса. Возможно ли это в настоящее время?

2 ответов


вам не нужно писать BsonClassMap.RegisterClassMap<MyClass>();, потому что все классы будут автоматически по умолчанию.

вы должны использовать RegisterClassMap когда вам нужна пользовательская сериализация:

 BsonClassMap.RegisterClassMap<MyClass>(cm => {
        cm.AutoMap();
        cm.SetIdMember(cm.GetMemberMap(c => c.SomeProperty));
    });

также вы можете использовать атрибуты для создания сериализации управления (это выглядит как более родной для меня):

[BsonId] // mark property as _id
[BsonElement("SomeAnotherName", Order = 1)] //set property name , order
[BsonIgnoreExtraElements] // ignore extra elements during deserialization
[BsonIgnore] // ignore property on insert

также вы можете создавать глобальные правила, которые используются во время automapping, например:

var myConventions = new ConventionProfile();
myConventions.SetIdMemberConvention(new NoDefaultPropertyIdConvention());
BsonClassMap.RegisterConventions(myConventions, t => true);

я использую только атрибуты и соглашения для управления сериализацией процесс.

надеюсь, что это поможет.


в качестве альтернативы регистрации на основе конвенции мне нужно было зарегистрировать карты классов для большого количества Types с некоторым пользовательским кодом инициализации и не хотел повторять RegisterClassMap<T> для каждого типа.

согласно комментарию KCD, если вам нужно явно зарегистрировать карты классов, Если вам нужно десериализовать полиморфные иерархии классов,можно использовать BsonClassMap.LookupClassMap который создаст автоматическую регистрацию по умолчанию для данного Тип.

однако мне нужно было прибегнуть к этому взлому, чтобы выполнить пользовательские шаги инициализации карты, и, к сожалению LookupClassMap блокирует карту при выходе, что предотвращает дальнейшее изменение возвращенный BsonClassMap:

var type = typeof(MyClass);

var classMapDefinition = typeof(BsonClassMap<>);
var classMapType = classMapDefinition.MakeGenericType(type);
var classMap = (BsonClassMap)Activator.CreateInstance(classMapType);

// Do custom initialization here, e.g. classMap.SetDiscriminator, AutoMap etc

BsonClassMap.RegisterClassMap(classMap);

приведенный выше код взят из BsonClassMap LookupClassMap реализация.