【问题标题】:Call Mapper.Map inside a custom type converter在自定义类型转换器中调用 Mapper.Map
【发布时间】:2016-06-13 09:50:01
【问题描述】:

我知道这个问题已经被问过一次 here 但没有必要在自定义类型转换器中调用 Automapper.Map() 方法。那么如果我有这种类型的结构呢:

class MyType
{
    public double ValueToBeComputed1 { get; set; }

    public double ValueToBeComputed2 { get; set; }
}

class ComplexType
{
    public double ValueToBeComputed { get; set; }
    public MyType MyProperty { get; set; }
}

对于所有要计算的值,我需要进行不同的演算,因此我将有一个复杂类型的自定义类型转换器,让我们说OtherType。我的问题是,我是否能够为该自定义转换器中的属性 MyProperty 调用 Mapper.Map()?

【问题讨论】:

  • 当你尝试调用它时发生了什么?
  • 我还没有调用它,我只是想知道它是否可能。

标签: c# automapper


【解决方案1】:

在我面对 Automapper 自定义类型转换器的过时文档后,其中 ITypeConverter 接口已更改,我在这里找到了答案: ITypeConverter interface has been changed in AutoMapper 2.0 ,我能够制作一个工作原型,它产生如下转换类型:

public class ComplexTypeConverter : ITypeConverter<ComplexSourceType, ComplexDestinationType>
{
    public ComplexDestinationType Convert(ResolutionContext context)
    {
        var source = (ComplexSourceType)context.SourceValue;

        return new ComplexDestinationType
        {
            MyProperty = Mapper.Map<SourceType, DestinationType>(source.MyProperty),
            ValueComputed = source.ValueToBeComputed + 10
        };
    }
}

public class TypeConverter : ITypeConverter<SourceType, DestinationType>
{
    public DestinationType Convert(ResolutionContext context)
    {
        var source= (SourceType)context.SourceValue;
        return new DestinationType
        {
            ValueComputed1 = source.ValueToBeComputed1 + 10,
            ValueComputed2 = source.ValueToBeComputed2 + 10
        };
    }
}

class Program
{
    static void Main(string[] args)
    {
        Mapper.Initialize(cfg => {
            cfg.CreateMap<ComplexSourceType, ComplexDestinationType>().ConvertUsing(new ComplexTypeConverter());
            cfg.CreateMap<SourceType, DestinationType>().ConvertUsing(new TypeConverter());
        });

        Mapper.AssertConfigurationIsValid();

        ComplexSourceType source = new ComplexSourceType
        {
            MyProperty = new SourceType
            {
                ValueToBeComputed1 = 1,
                ValueToBeComputed2 = 1
            },
            ValueToBeComputed = 1
        };
        var dest = Mapper.Map<ComplexSourceType, ComplexDestinationType>(source);
    }
}

dest 对象保存修改后的数据,每个属性有 11 个

【讨论】:

  • 我觉得界面又变了。 Mapper 没有为我初始化。
  • @ahong 你是对的,从写这个答案的那一天起,AutoMapper API 就发生了变化。我认为这个答案是为 AutoMapper 4.2.1 版编写的,现在它发布了 9.0.0 版。我假设你使用它。根据您需要做什么,我鼓励您在此问题下的评论中描述它或打开另一个问题。
  • 回复晚了,但我也遇到了同样的问题。您现在可以使用context.Mapper 来获取应该初始化的运行时映射器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2012-09-10
  • 2016-11-24
  • 1970-01-01
  • 2012-06-23
  • 2010-09-09
相关资源
最近更新 更多