【发布时间】:2018-01-19 19:33:02
【问题描述】:
我正在使用带有 AutoMapper 的 ASP.net Core。为了让 DI 运行,我使用 AutoMapper.Extensions.Microsoft.DependencyInjection Nuget-Package 并让 AutoMapper 通过
注册配置文件 private static void InitializeAutoMapper(IServiceCollection services)
{
services.AddAutoMapper();
}
这很好用,但是对于某些配置文件,我还想向它们注入一些依赖项,例如:
public class IndividualDtoProfile : Profile
{
private readonly IIndividualFactory _individualFactory;
private readonly IMapper _mapper;
public IndividualDtoProfile(IIndividualFactory individualFactory, IMapper mapper)
{
_individualFactory = individualFactory;
_mapper = mapper;
}
public IndividualDtoProfile()
{
CreateMap<Individual, IndividualDto>();
CreateMap<IndividualDto, Individual>()
.ConstructUsing(
dto =>
{
var gender = _mapper.Map<IndividualGender>(dto.Gender);
return _individualFactory.CreateIndividual(dto.FirstName, dto.LastName, gender, dto.BirthDate);
});
}
}
我发现的唯一相关讨论在这里:https://groups.google.com/forum/#!topic/automapper-users/5XK7pqGu_Tg
这似乎暗示不要利用现有可能性的优点,而是手动映射配置文件。我看到的唯一另一种可能性是提供静态 ServiceProvider-Singleton,这似乎也不太吸引人。
是否已经有可能将 ASP.Net Core 与 AutoMapper 结合使用并让依赖项注入到 Profiles 中?
编辑:由于评论,我可能也有一些根本性的错误:我正在学习领域驱动设计,我有一个应用层。我想将从 Web 服务中使用的 DTO 映射回域实体,并且我认为在那里使用工厂也是有意义的,因为否则我会绕过工厂中的逻辑。
【问题讨论】:
-
在这里添加DI真的有意义吗?最后,它只是一个对象到另一个对象的映射。如果你有测试,你也需要测试/模拟映射。从我的角度来看,双重工作。
-
嗯?我不明白你的意思:我想用 AutoMapper 进行一般映射,但对于某些地图,我想使用工厂以确保一些不变量并确保每个对象都是为其特定的工厂创建的。跨度>
-
你为什么要在配置文件中使用/注入
IMapper??!配置文件用于在映射器准备好使用之前添加注册(即通过Mapper.AssertConfigurationIsValid()执行验证)。虽然我通常也喜欢在任何地方注入 IMapper,但也有一些限制。您是否使用 Automapper 的 EF 投影?它们不能轻松地与注入一起工作,因为.ProjectTo()方法使用静态Mapper类来代替 -
另外我假设你的
Individual是一个 EF/EF Core Poco,在这种情况下:永远不要从 Dto 映射到 Persistence 或 Domain Models,它会让你非常痛苦(EF Core 使用引用,以这种方式映射可能会破坏 EF Core 处理实体的方式,尤其是在集合上) -
@MatthiasMüller 在所有神奇的东西(验证、从数据库中获取数据等)之后,我更喜欢使用映射。它应该尽可能简单。 (海事组织)
标签: c# dependency-injection asp.net-core automapper