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。如何避免重复代码?
答案 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
是限制类型的过滤器。