如何为MongoDb命名空间中的所有类注册ClassClassMap?

时间:2011-03-31 19:57:31

标签: c# mongodb mongodb-.net-driver

MongoDB driver tutorial建议通过

将类映射注册到automap
BsonClassMap.RegisterClassMap<MyClass>();

我想自动化给定命名空间的所有类,而不是为每个类显式写下RegisterClassMap。这目前可能吗?

2 个答案:

答案 0 :(得分:12)

您不需要编写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);

我只使用属性和约定来管理序列化过程。

希望得到这个帮助。

答案 1 :(得分:3)

作为基于约定的注册的替代方法,我需要使用一些自定义初始化代码为大量Type注册类映射,并且不想重复RegisterClassMap<T>每种类型。

根据KCD的评论,如果您需要显式注册类映射,如果需要反序列化多态类层次结构,you can use 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实现。