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

tob*_*sen 7 c# mongodb mongodb-.net-driver

在MongoDB的驱动教程提示注册类映射到通过自动映射

BsonClassMap.RegisterClassMap<MyClass>();
Run Code Online (Sandbox Code Playgroud)

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

And*_*ich 12

您不需要写入BsonClassMap.RegisterClassMap<MyClass>();,因为默认情况下所有类都将自动执行.

您应该RegisterClassMap在需要自定义序列化时使用:

 BsonClassMap.RegisterClassMap<MyClass>(cm => {
        cm.AutoMap();
        cm.SetIdMember(cm.GetMemberMap(c => c.SomeProperty));
    });
Run Code Online (Sandbox Code Playgroud)

您还可以使用属性来创建管理序列化(对我来说,它看起来更像是原生的):

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

您还可以创建在自动化期间使用的全局规则,如下所示:

var myConventions = new ConventionProfile();
myConventions.SetIdMemberConvention(new NoDefaultPropertyIdConvention());
BsonClassMap.RegisterConventions(myConventions, t => true);
Run Code Online (Sandbox Code Playgroud)

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

希望这有帮助.

  • 注意`你必须自己调用RegisterClassMap的一种情况(即使没有参数)就是当你使用多态类层次结构时:在这种情况下你必须注册所有已知的子类以保证鉴别器被注册.http:/:http:/ /docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/#CSharpDriverSerializationTutorial-Creatingaclassmap (11认同)

Stu*_*tLC 5

作为基于约定的注册的替代方案,我需要使用一些自定义初始化代码来注册大量Types 的类映射,并且不想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);
Run Code Online (Sandbox Code Playgroud)

上面的代码是根据BsonClassMap LookupClassMap实现改编的。