Заполнение данных AutoMapper - PullRequest
3 голосов
/ 19 июля 2011

Можно ли использовать AutoMapper для заполнения объекта деталями из другого объекта?Например (предполагая предыдущую конфигурацию):

var foo = new Foo { PropA = "", PropB = "Foo" };
var bar = new Bar { PropA = "Bar", PropB = "" };

Mapper.Map<Foo, Bar>(foo, bar);

Console.WriteLine(bar.PropB); //Returns "Foo"

Просто интересно, пытался ли кто-нибудь пытаться использовать этот явно странный способ отображения, который больше походил бы на объединение соответствующих данных одного объекта в другой.Заранее спасибо!

Обновление:

Похоже, ValueInjector является более подходящим для этой ситуации.В StackOverflow уже ведутся отличные дискуссии о правильном использовании AutoMapper и ValueInjecter.

Ответы [ 3 ]

5 голосов
/ 19 июля 2011

Если имена свойств совпадают, они автоматически сопоставляются. Если по какой-либо причине этого не происходит, вы можете указать отображение самостоятельно.

Итак, PropA не соответствует PropertyA, поэтому вам придется указать сопоставление. Тем не менее, PropB соответствует, так что вы не.

var foo = new Foo { PropA = "", PropB = "Foo" };
var bar = new Bar { PropertyA = "Bar", PropertyB = "" };

Mapper.CreateMap<Foo, Bar>()
      .ForMember(dest => dest.PropertyA, opt => opt.MapFrom(src => src.PropA));

Mapper.Map<Foo, Bar>(foo, bar);
2 голосов
/ 21 июля 2011

хорошо, с ValueInjecter вы можете сделать

bar.InjectFrom(foo);

, и ваш бар будет:

{PropA = "", ProbB = "Foo"}, 

точно так же, как Foo, но если вы хотите взять только неНулевые / пустые значения, чтобы получить

{PropA = "Foo", PropbB = "Bar"}

, вы можете создать новую Инъекцию

public class NonNullEmptyInj : ConventionInjection
{
      protected override bool Match(ConventionInfo c)
      {
        if (c.SourceProp.Name != c.TargetProp.Name
                           || c.SourceProp.Type != c.TargetProp.Type) return false;
        if(c.SourceProp.Value == null) return false;
        if (c.SourceProp.Type == typeof(string) && c.SourceProp.Value.ToString() == string.Empty) return false;
        return true;
       }
}

и использовать ее так:

bar.InjectFrom<NonNullEmptyInj>(foo);
0 голосов
/ 19 июля 2011

Как уже говорили другие, перед публикацией вы должны сделать больше домашней работы.Но взгляните на метод Mapper.AssertConfigurationIsValid, пока вы его используете.

    [Test]
    public void Mappings_Should_Map()
    {
        //configure mapping here

        //Assert
        Mapper.AssertConfigurationIsValid();
    }

Это скажет вам, работает ли отображение, если нет, то сообщит, какие свойства не применяются.Как только вы узнаете, что такое неудачные сопоставления, вы можете создать конкретные карты с помощью метода .ForMember.

...