MongoDB 驱动程序教程建议通过以下方式将类映射注册到自动映射
BsonClassMap.RegisterClassMap<MyClass>();
我想自动映射给定命名空间的所有类,而无需为每个类显式写下 RegisterClassMap。这目前可能吗?
MongoDB 驱动程序教程建议通过以下方式将类映射注册到自动映射
BsonClassMap.RegisterClassMap<MyClass>();
我想自动映射给定命名空间的所有类,而无需为每个类显式写下 RegisterClassMap。这目前可能吗?
您不需要 write 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);
我只使用属性和约定来管理序列化过程。
希望这有帮助。
作为基于约定的注册的替代方案,我需要使用一些自定义初始化代码为大量Type
s 注册类映射,并且不想RegisterClassMap<T>
为每种类型重复。
根据 KCD 的评论,如果需要反序列化多态类层次结构时确实需要显式注册类映射,则可以使用 BsonClassMap.LookupClassMap
它将为给定类型创建默认的 AutoMapped 注册。
但是,我需要求助于这个 hack 来执行自定义地图初始化步骤,不幸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
实现。