如何在不使用属性的情况下指定用于MongoDB反序列化的构造函数(C#)

时间:2015-08-25 18:12:00

标签: c# mongodb

注意:我正在使用MongoDB C#Driver 2.0

我想复制BsonConstructor属性的行为,但使用BsonClassMap API。

这样的事情:

BsonClassMap.RegisterClassMap<Person>(cm =>
{
    cm.AutoMap();
    cm.MapCreator(p => new Person(p.FirstName, p.LastName));
});

但无需指定每个参数。

我想这样做的原因是我不想因实施问题而“污染”我的域模型。

我找到了这个(SetCreator)

BsonClassMap.RegisterClassMap<Person>(cm =>
{
    cm.AutoMap();
    cm.SetCreator(what goes here?);
});

但我不知道如何使用SetCreator函数,如果它做了我认为它做的...

1 个答案:

答案 0 :(得分:1)

我使用约定而不是BsonClassMap

获得了相同的结果

这是一个示例(从只读公共属性读取(序列化)和写入(反序列化)到构造函数)

public class MongoMappingConvention : IClassMapConvention
    {
        public string Name
        {
            get { return "No use for a name"; }
        }

        public void Apply(BsonClassMap classMap)
        {
            var nonPublicCtors = classMap.ClassType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);

            var longestCtor = nonPublicCtors.OrderByDescending(ctor => ctor.GetParameters().Length).FirstOrDefault();

            classMap.MapConstructor(longestCtor);

            var publicProperties = classMap.ClassType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .Where(p => p.CanRead);

            foreach (var publicProperty in publicProperties)
            {
                classMap.MapMember(publicProperty);
            }
        }
    }