我在Automapper中找到的大多数示例都使用静态Mapper对象来管理类型映射.对于我的项目,我需要使用StructureMap注入IMapperEngine作为对象构造的一部分,以便我们可以在单元测试中模拟映射器,因此我们不能使用静态映射器.我还需要支持配置AutoMapper配置文件.
我的问题是如何配置StructureMap注册表,以便在构造MyService实例时它可以提供IMappingEngine的实例.
这是Service构造函数签名:
public MyService(IMappingEngine mapper, IMyRepository myRepository, ILogger logger)
Run Code Online (Sandbox Code Playgroud)
这是StructureMap注册表
public class MyRegistry : StructureMap.Configuration.DSL.Registry
{
public MyRegistry()
{
For<IMyRepository>().Use<MyRepository>();
For<ILogger>().Use<Logger>();
//what to do for IMappingEngine?
}
}
Run Code Online (Sandbox Code Playgroud)
我要加载的配置文件
public class MyAutoMapperProfile : AutoMapper.Profile
{
protected override void Configure()
{
this.CreateMap<MyModel, MyDTO>();
}
}
Run Code Online (Sandbox Code Playgroud) 我在AutoMapper中遇到了自定义解析器的一些问题.我传递的接口到我的存储库的构造函数,但我不断收到以下错误:
Type needs to have a constructor with 0 args or only optional args
Parameter name: type
Run Code Online (Sandbox Code Playgroud)
我可以通过创建一个无参数构造函数并在那里硬编码我的repo的具体实现来解决它,但我想注入它.
我的解析器:
public class OptionGroupProjectionResolver : ValueResolver<Product, List<OptionGroupProjection>>
{
private readonly IOptionGroupRepository _optionGroupRepository;
public OptionGroupProjectionResolver(IOptionGroupRepository optionGroupRepository)
{
_optionGroupRepository = optionGroupRepository;
}
protected override List<OptionGroupProjection> ResolveCore(Product source)
{
var groupIds = new List<int>();
var optIds = new List<int>();
foreach (var variant in source.Variants)
{
groupIds.AddRange(variant.Options.Select(option => option.GroupId).Distinct());
optIds.AddRange(variant.Options.Select(option => option.Id).Distinct());
}
var groups = _optionGroupRepository.GetAll();
var results = from gr in groups
where groupIds.Contains(gr.Id) …Run Code Online (Sandbox Code Playgroud) 我只是尝试将AutoMapper升级到5.0.2,但遇到了障碍。
根据迁移文档,值解析器现在可以访问目标对象:
值解析器的签名已更改,以允许访问源/目标模型。
结果是,每个值解析器都精确地绑定到一个目标类型。
但是,我们的某些价值解析器可用于多种目的地类型。例如,我们有一个解析器,用于映射DTO的所有ID属性。解析程序通过注入到解析程序中的服务来修改ID。
如何在AutoMapper 5中定义可重用的值解析器,这样我就不必为具有完全相同的实现的每种目标类型创建专用的解析器?
注意:使用值解析器而不是直接操作值的主要原因是依赖项注入。按照这个答案,值解析器是在映射过程中使用依赖项注入服务的最佳方法。