AutoMapper 依赖注入
示例
ASP.NET Core
有一个 NuGet 包 用于与 此处 描述的默认注入机制一起使用,并在 此项目 中使用。
提示
从 13.0 版本开始,AddAutoMapper
成为核心包的一部分,DI 包已停用。
您可以使用 配置文件 定义配置。然后,您需要在启动时通过调用 IServiceCollection
扩展方法 AddAutoMapper
来告知 AutoMapper
配置文件定义在哪些程序集中:
services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/);
或使用标记类型:
services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/);
现在,您可以在运行时将 AutoMapper
注入到服务/控制器中:
public class EmployeesController {
private readonly IMapper _mapper;
public EmployeesController(IMapper mapper) => _mapper = mapper;
// 使用 _mapper.Map 或 _mapper.ProjectTo
}
AutoFac
有一个第三方 NuGet 包 供您尝试。
另外,请查看 此博客 。
其他 DI 引擎
低级 API
AutoMapper 支持使用静态服务定位器构造 自定义值解析器、自定义类型转换器 和 值转换器 :
var configuration = new MapperConfiguration(cfg =>
{
cfg.ConstructServicesUsing(ObjectFactory.GetInstance);
cfg.CreateMap<Source, Destination>();
});
或使用动态服务定位器,适用于基于实例的容器(包括子/嵌套容器):
var mapper = new Mapper(configuration, childContainer.GetInstance);
var dest = mapper.Map<Source, Destination>(new Source { Value = 15 });
可查询扩展
提示
从 8.0 开始,您可以使用
IMapper.ProjectTo
。对于旧版本,您需要将配置传递给扩展方法IQueryable.ProjectTo<T>(IConfigurationProvider)
。
请注意,ProjectTo
相比于 Map
功能更为有限,因为它只支持底层 LINQ
提供程序允许的操作。这意味着您不能像使用 Map
那样在值解析器和转换器中使用 DI
。