如何避免重复c#mongodb中所有类的setIdGenerator?

时间:2017-01-27 08:55:48

标签: c# asp.net mongodb asp.net-core

public static void RegisterMappings()
        {
            BsonClassMap.RegisterClassMap<Job>(map =>
            {
                map.AutoMap();
                map.IdMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);
            });

            BsonClassMap.RegisterClassMap<JobRun>(map =>
            {
                map.AutoMap();
                map.IdMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);
            });
        }

在我项目的所有课程中,我都有Id属性。我必须为所有类设置idgenerator。如何避免重复代码?

2 个答案:

答案 0 :(得分:1)

如果为所有需要注册的类定义接口ISetIdGenerator,可以执行以下操作:

var types = Assembly.GetExecutingAssembly().ExportedTypes
           .Where(x=>x.GetInterfaces().Contains(typeof(ISetIdGenerator)));

foreach (var type in types)
{
    var classMap = new BsonClassMap(type);
    classMap.AutoMap();
    classMap.IdMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);
    BsonClassMap.RegisterClassMap(classMap);
}

当然,您可以避免使用此接口并为解决方案中的所有类注册映射器,但我认为这有点开销。

答案 1 :(得分:0)

您可以创建IClassMapConvention并注册。

public class IdGeneratorClassMapConvention : ConventionBase, IClassMapConvention
{
    public void Apply(BsonClassMap classMap)
    {
            map.AutoMap();
            map.IdMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);
    }
}

并注册

        ConventionRegistry.Register("IdGeneratorConvention", new ConventionPack
        {
            new IdGeneratorClassMapConvention()
        }, t => !t.GetTypeInfo().IsEnum);

这会将其应用于所有非枚举类型。你还需要拨打BsonClassMap.RegisterClassMap<T>() iirc。第二个参数t => !t.GetTypeInfo().IsEnum是限制类型的过滤器。