Как зарегистрировать ClassCap для всех классов в пространстве имен для MongoDb? - PullRequest
7 голосов
/ 31 марта 2011

В руководстве по драйверу MongoDB предлагается зарегистрировать карты классов для автоматического выбора с помощью

BsonClassMap.RegisterClassMap<MyClass>();

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

Ответы [ 2 ]

12 голосов
/ 01 апреля 2011

Вам не нужно писать 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

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

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

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

Надеюсь, эта помощь.

3 голосов
/ 01 сентября 2015

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

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

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

...