AutoMapper 9.0的改造
开篇,做了一个自动化注册的
public sealed class AutoInjectAttribute : Attribute { public Type SourceType { get; } public Type TargetType { get; } public AutoInjectAttribute(Type sourceType, Type targetType) { SourceType = sourceType; TargetType = targetType; } }
增加了一个特性,在Dto上面打上,参数1是源类型,参数2是Dto类型
增加一个工厂类保存自动转换的类型
public class AutoInjectFactory { public List<(Type,Type)> ConvertList { get; } = new List<(Type, Type)>(); public void AddAssemblys(params Assembly[] assemblys) { foreach (var assembly in assemblys) { var atributes = assembly.GetTypes() .Where(_type => _type.GetCustomAttribute<AutoInjectAttribute>() != null) .Select(_type => _type.GetCustomAttribute<AutoInjectAttribute>()); foreach (var atribute in atributes) { ConvertList.Add((atribute.SourceType, atribute.TargetType)); } } } }
在原来的AddAutoMapper上找到修改的代码段
public static IServiceCollection AddAutoMapper(this IServiceCollection service) { ...略 service.TryAddSingleton(serviceProvider => { var mapperConfigurationExpression = serviceProvider.GetRequiredService<MapperConfigurationExpression>(); var instance = new MapperConfiguration(mapperConfigurationExpression); instance.AssertConfigurationIsValid(); return instance; }); ...略 return service; }
改为
public static IServiceCollection AddAutoMapper(this IServiceCollection service) { ...略 service.TryAddSingleton(serviceProvider => { var mapperConfigurationExpression = serviceProvider.GetRequiredService<MapperConfigurationExpression>(); var factory = serviceProvider.GetRequiredService<AutoInjectFactory>(); foreach (var (sourceType,targetType) in factory.ConvertList) { mapperConfigurationExpression.CreateMap(sourceType, targetType); } var instance = new MapperConfiguration(mapperConfigurationExpression); instance.AssertConfigurationIsValid(); return instance; }); ...略 return service; }
增加一组扩展方法
public static class AutoMapperExtension { ...略 public static void UseAutoInject(this IApplicationBuilder applicationBuilder, params Assembly[] assemblys) { var factory = applicationBuilder.ApplicationServices.GetRequiredService<AutoInjectFactory>(); factory.AddAssemblys(assemblys); } }
在Startup.Configure方法内调用一下
看看测试
增加一个测试控制器
执行结果
原文链接:https://www.cnblogs.com/NCoreCoder/p/11453443.html
版权申明:内容来源网络,版权归原创者所有。除非无法确认,都会标明作者及出处,如有侵权,烦请告知,我们会立即删除并致歉!
支付宝打赏 支付宝扫一扫二维码 微信打赏 微信扫一扫二维码 微信扫一扫 关注公众号