首页 > 解决方案 > 使用 automapper 将单个对象映射到对象列表中

问题描述

我的映射器中有以下行:

我试图从一个模型映射到一个模型,其中我有一个名为 Result 的属性到我有一个结果列表的模型。

到目前为止,我有以下内容:

options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();


internal class ResultConverter : ITypeConverter<Contract.Dto.Result, List<Result>>
    {
        public List<Result> Convert(Contract.Dto.Result source, List<Result> destination, ResolutionContext context)
        {
            destination.Add(context.Mapper.Map<Contract.Dto.Result, Result>(source));
            return destination;
        }
    }

但是,在调试时,ResultConverter 永远不会被命中。有人对如何从单个对象映射到对象列表有任何解决方案吗?此对象列表中只会有一个对象,但其他约束阻止我修改模型。

标签: c#automapper

解决方案


我已经设法在我创建的一个非常小的类库中让它工作。我注意到可能会破坏您的代码的位:

没有提及您也在映射 <Contract.Dto.Result, Result> 的任何地方 - 确保您已添加这两个映射

var config = new MapperConfiguration(options =>
{
    options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
    options.CreateMap<Contract.Dto.Result, Result>(MemberList.Source);
});

在您的转换器中,我将其更改为使用新的结果列表而不是目标

public List<Result> Convert(Contract.Dto.Result source, List<Result> destination, ResolutionContext context)
{
    var listOfResults = new List<Result>();
    var result = context.Mapper.Map<Contract.Dto.Result, Result>(source);
    listOfResults.Add(result);
    return listOfResults;
}

实际使用地图时,只需确保您有正确的语法

var result = new Contract.Dto.Result();
var expected = mapper.Map<List<Result>>(result);

此外,如果使用 IOC,请确保您已注册转换者。下面的 Autofac 代码示例

 builder.RegisterType<ResultConverter>().AsSelf();
 builder.Register(context => new MapperConfiguration(options=>
 {
     options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
     options.CreateMap<Contract.Dto.Result, Result>(MemberList.Source);
 })).AsSelf().SingleInstance();


 builder.Register(c =>
 {
     //This resolves a new context that can be used later.
     var context = c.Resolve<IComponentContext>();
     var config = context.Resolve<MapperConfiguration>();
     return config.CreateMapper(context.Resolve);
 }).As<IMapper>().InstancePerLifetimeScope();

正如下面评论中提到的 OP,还要确保使用正确的类型,在这种情况下 List<> vs IList<>

在您的项目中尝试这些方法,希望能解决您的问题。如果不让我知道,我可以进一步看看。


推荐阅读