AutoMapper官方文档(十四)【依赖注入】
2017-11-28 16:57
417 查看
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 });
一个意想不到或不直观的错误
使用DI与使用
IQueryable.ProjectTo扩展方法有效地互斥。使用
IEnumerable.Select(_mapper.Map<DestinationType>).ToList()来代替。
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; } }
简单的注入器
工作流程如下:通过MyRegistrar.Register注册您的类型 MapperProvider允许您直接将IMapper的一个实例注入到其他类中 SomeProfile使用PropertyThatDependsOnIocValueResolver解析一个值 PropertyThatDependsOnIocValueResolver已经注入IService,然后可以使用
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); } }
相关文章推荐
- ABP官方文档(七)【依赖注入】
- ABP官方文档翻译 2.1 依赖注入
- TestNG官方文档中文版(7)-方法依赖和工厂
- Autofac官方文档(五)【注册组件之属性和方法注入】
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
- AutoMapper官方文档(二)【升级指南】
- AutoMapper官方文档(七)【配置验证】
- AutoMapper官方文档(十二)【自定义值解析器】
- Spring Boot参考文档(9)依赖注入
- Android官方文档翻译 十四 3.2Supporting Different Screens
- Autofac官方文档(十三)【捕获依赖】
- AutoMapper官方文档(十三)【值转换器,Null替换,Map行为前后】
- Autofac官方文档(十四)【销毁】
- ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- .NET Core中依赖注入AutoMapper的方法示例
- AutoMapper官方文档(十五)【映射继承】
- 【AutoMapper官方文档】DTO与Domin Model相互转换(下)
- AutoMapper官方文档(十六)【可查询扩展】