【问题标题】:How to map complex models如何映射复杂模型
【发布时间】:2012-04-09 15:53:18
【问题描述】:

我有一个如下所示的源模型:

public class FooBar {
    public Foo foo {get;set;}
    public Bar bar {get;set;|
}

public class Foo {
    // tons of properties
}

public class Bar {
    // tons of irrelevant properties
    public Baz baz {get;set;}
}

然后我有一个将 FooBar 扁平化为 NewFooBar 的目标模型,如下所示:

public class NewFooBar {
    // all properties from Foo
    public Baz baz {get;set;}
}

如何将 FooBar 映射到 NewFooBar 而不必单独映射 foo 的所有属性? (有很多)。

我的第一个解决方案是将 Foo 和 Bar 分别映射到 NewFooBar,这很有效。然后单独执行映射。但这似乎很笨拙。如果可能的话,我宁愿在单个映射中进行。我是否错过了一些简单的方法来做到这一点?

【问题讨论】:

    标签: automapper flatten


    【解决方案1】:

    这行得通吗?

    Mapper.CreateMap<Foo, NewFooBar>()
                .ForMember(dest => dest.baz, opt => opt.Ignore())
                ;
    
    Mapper.CreateMap<FooBar, NewFooBar>()
        .ConvertUsing(src => {
            var newFooBar = AutoMapper.Mapper.Map<Foo, NewFooBar>(src.foo);
    
            newFooBar.baz = src.bar.baz;
    
            return newFooBar;
        });
        ;
    

    然后

    var newFooBar = AutoMapper.Mapper.Map<FooBar, NewFooBar>(fooBar);
    

    【讨论】:

    • 嗯,这并没有好多少,而且可以说比简单地执行两张地图更复杂。但这是一个有趣的想法。
    • CreateMap 在一个地方完成一次。我们的想法是保持地图简洁,在这种情况下,它就像任何其他地图一样,即不必每次都记住两张地图。
    • 这很好。在这种情况下,我认为你是对的。但是,我有另一种情况,我在另一个问题中询问过.. 你介意看一下吗? stackoverflow.com/questions/10091653/…
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2016-08-04
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多