【问题标题】:Automapper instantiates destination object instead of mapping recursivelyAutomapper 实例化目标对象而不是递归映射
【发布时间】:2012-09-21 01:01:01
【问题描述】:

我正在尝试将我的 DTO 对象映射到我的工厂类中的实体对象。 DTO 的所有字段值都是直接的,而实体的字段由名称和值组成。

经过一些调试,我发现 Automapper 实例化了每个实体字段,而不是使用现有的。结果,最后的测试失败了。

[TestFixture]
class RecursiveMappingTest
{
    public class SourceInfo
    {
        public string Info1 = "info1";
        public string Info2 = "info1";
    }

    public class StringField
    {
        public string Name;
        public string Value;
    }

    public class DestinationInfo
    {
        public StringField Info1 = new StringField() { Name = "field name 1" };
        public StringField Info2 = new StringField() { Name = "field name 2" };
    }

    [Test]
    public void MapField()
    {
        Mapper.CreateMap<string, StringField>()
            .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src));

        Mapper.CreateMap<SourceInfo, DestinationInfo>();

        SourceInfo sourceInfo = new SourceInfo();
        DestinationInfo destinationInfo = new DestinationInfo();

        Mapper.Map(sourceInfo, destinationInfo);

        // these pass
        Assert.That(destinationInfo.Info1.Value, Is.EqualTo("info1"));
        Assert.That(destinationInfo.Info2.Value, Is.EqualTo("info1"));

        // this fails since automapper instantiated brand new StringField()
        // which has Name == "".
        Assert.That(destinationInfo.Info1.Name, Is.EqualTo("field name 1"));
    }
}

这是预期的行为吗?我怎样才能达到我想要的?实体类中有大量字段,所以this workaround will not work for me

【问题讨论】:

  • 我最终使用ValueInjector 来解决这个问题。它还解决了这个问题得到解决后我必须经历的其他 Automapper 挑战。 ValueInjector 没有任何魔力,但一切都是透明的——或者我应该说简单的结构才是真正的魔力——源代码很容易掌握和学习,以制作您定制的注入代码。我将保留这个问题,因为我很想知道 Automapper 中的这个特殊问题。
  • 如果实体中的字段数是问题,您总是可以使用 t4 模板。

标签: c# automapper


【解决方案1】:

尝试将您的第二张地图更改为:

Mapper.CreateMap<SourceInfo, DestinationInfo>()
.ForAllMembers(x => x.UseDestinationValue());

这应该对所有未映射的属性使用目标值。

【讨论】:

  • Mapper.AssertConfigurationIsValid() 失败,但它对我有用,因为我有不同的方法来检查所有内容是否映射良好。谢谢虚空雷!
  • 我发现了另一个问题。很奇怪,但是如果我将值更改为相同(就像两者都是 "info1"),我会收到一条错误消息,提示 System.ArgumentException : An item with the same key has already been added. 我更改了问题以反映问题。
猜你喜欢
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多