繁体   English   中英

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

[英]How can I specify the constructor to use for MongoDB deserialization without using attributes (C#)

注意:我使用的是 MongoDB C# 驱动程序 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 函数,如果它做了我认为的那样......

我使用约定而不是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);
            }
        }
    }

老问题,我知道,但这样的事情对我来说适用于 MongoDB 驱动程序 2.10.4:

    var mapper = new BsonClassMap(type);
    mapper.AutoMap();

    var constructorInfo = type.GetConstructor(...); // Find the constructor you want to use
    mapper.MapConstructor(constructorInfo, new[] {"FirstName", "LastName"});

请注意,传递给MapConstructor的数组具有属性名称,而不是构造函数参数名称。 据我了解,它按照构造函数参数的顺序进行,但它们可能具有不同的名称,例如

public Person(string givenName, string surname)
{
    FirstName = givenName;
    LastName = surname;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM