https://www.jianshu.com/p/f66447282780

 

依赖注入(Dependency Injection)

AutoMapper支持使用静态服务定位构建自定义值解析器和自定义类型转换器的功能:

Mapper.Initialize(cfg =>
{
cfg.ConstructServicesUsing(ObjectFactory.GetInstance); cfg.CreateMap<Source, Destination>();
});

或者在基于实例的容器(包括子/嵌套容器)中使用动态服务定位:

var mapper = new Mapper(Mapper.Configuration, childContainer.GetInstance);

var dest = mapper.Map<Source, Destination>(new Source { Value = 15 });

陷阱

使用IQueryable.ProjectTo扩展方法与使用依赖注入是互斥的。请使用
IEnumerable.Select(_mapper.Map<DestinationType>).ToList() 来代替IQueryable.ProjectTo

ASP.NET Core

有一个NuGet包与这里描述的默认注入机制搭配使用。

Ninject

对于那些使用Ninject的人来说,这有一个AutoMapper使用的Ninject模块的例子

public class AutoMapperModule : NinjectModule
{
public override void Load()
{
Bind<IValueResolver<SourceEntity, DestModel, bool>>().To<MyResolver>(); var mapperConfiguration = CreateConfiguration();
Bind<MapperConfiguration>().ToConstant(mapperConfiguration).InSingletonScope(); // This teaches Ninject how to create automapper instances say if for instance
// MyResolver has a constructor with a parameter that needs to be injected
Bind<IMapper>().ToMethod(ctx =>
new Mapper(mapperConfiguration, type => ctx.Kernel.Get(type)));
} private MapperConfiguration CreateConfiguration()
{
var config = new MapperConfiguration(cfg =>
{
// Add all profiles in current assembly
cfg.AddProfiles(GetType().Assembly);
}); return config;
}
}

简单注入器实现

工作流程如下:

  1. 通过 MyRegistrar.Register注册你的类型
  2. MapperProvider允许你直接将IMapper的实例注入到其他类中
  3. SomeProfile使用PropertyThatDependsOnIocValueResolver解析值
  4. PropertyThatDependsOnIocValueResolverIService注入其中

ValueResolver能访问IService,是因为我们通过MapperConfigurationExpression.ConstructServicesUsing注册容器。

public class MyRegistrar
{
public void Register(Container container)
{
// Injectable service
container.RegisterSingleton<IService, SomeService>(); // Automapper
container.RegisterSingleton(() => GetMapper(container));
} private AutoMapper.IMapper GetMapper(Container container)
{
var mp = container.GetInstance<MapperProvider>();
return mp.GetMapper();
}
} public class MapperProvider
{
private readonly Container _container; public MapperProvider(Container container)
{
_container = container;
} public IMapper GetMapper()
{
var mce = new MapperConfigurationExpression();
mce.ConstructServicesUsing(_container.GetInstance); var profiles = typeof(SomeProfile).Assembly.GetTypes()
.Where(t => typeof(Profile).IsAssignableFrom(t))
.ToList(); mce.AddProfiles(profiles); var mc = new MapperConfiguration(mce);
mc.AssertConfigurationIsValid(); IMapper m = new Mapper(mc, t => _container.GetInstance(t)); return m;
}
} public class SomeProfile : Profile
{
public SomeProfile()
{
var map = CreateMap<MySourceType, MyDestinationType>();
map.ForMember(d => d.PropertyThatDependsOnIoc, opt => opt.ResolveUsing<PropertyThatDependsOnIocValueResolver>());
}
} public class PropertyThatDependsOnIocValueResolver : IValueResolver<MySourceType, object, int>
{
private readonly IService _service; public PropertyThatDependsOnIocValueResolver(IService service)
{
_service = service;
} int IValueResolver<MySourceType, object, int>.Resolve(MySourceType source, object destination, int destMember, ResolutionContext context)
{
return _service.MyMethod(source);
}
}

码字不易,动动手指给个赞吧

最新文章

  1. 配置ubuntu 16.04.1 LTS odoo 10.0开发环境
  2. double 类型转化为Integer类型 ---DecimalFormat
  3. Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)
  4. 【Ruby on Rails学习二】在线学习资料的整理
  5. TableLayoutPanel 的使用
  6. 一步步学习Python-django开发-建立django数据库
  7. webform在页面生成的代码与事件回传
  8. [javascript] postmessage
  9. 【转】C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
  10. 转载一篇阿里云Terraform 开发指南
  11. [转]bitcoin API reference (JSON-RPC)
  12. 【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树
  13. [转贴] 软件测试职业发展的 A 面和 B 面
  14. tween 缓动动画
  15. select下拉菜单实现通过数据库查询来设置默认值
  16. linux常见系统调用函数列表
  17. [C++]String::find
  18. http 206请求
  19. DHCP 服务测试
  20. 画一条0.5px的边

热门文章

  1. Aragorn&#39;s Story
  2. echarts之bootstrap选项卡不能显示其他标签echarts图表
  3. java实现二分法查找
  4. SAP MaxDB日常运维—启动、关闭、磁盘扩容
  5. celery 启动命令
  6. Python基本语法_控制流语句_if/while/for
  7. nmon报告指标含义
  8. MM相关号码范围IMG设定
  9. 转载-c++深拷贝和浅拷贝
  10. Activity启动模式分类(一)