Как использовать AutoMapper?

Впервые использую AutoMapper, и мне трудно понять, как его использовать. Я пытаюсь сопоставить ViewModel с таблицами базы данных.

Моя ViewModel выглядит так...

public class AddressEditViewModel
{
    public AddressEdit GetOneAddressByDistrictGuid { get; private set; }
    public IEnumerable<ZipCodeFind> GetZipCodes { get; private set; }

    public AddressEditViewModel(AddressEdit editAddress, IEnumerable<ZipCodeFind> Zips)
    {
        this.GetOneAddressByDistrictGuid = editAddress;
        this.GetZipCodes = Zips;
    }
}   

Отображение, которое я пытаюсь использовать, это...

CreateMap<Address, AddressEditViewModel>();  

Когда я запускаю этот тест...

public void Should_map_dtos()
{
    AutoMapperConfiguration.Configure();
    Mapper.AssertConfigurationIsValid();
}  

Я получаю эту ошибку...

AutoMapper.AutoMapperConfigurationException: Следующие 2 свойства в JCIMS_MVC2.DomainModel.ViewModels.AddressEditViewModel не сопоставляются: GetOneAddressByDistrictGuid GetZipCodes Добавьте пользовательское выражение сопоставления, игнорируйте или переименовывайте свойство в JCIMS_MVC2.DomainModel.Address.

Я не уверен, как я должен сопоставить эти 2 свойства. Буду признателен за любое направление. Спасибо

отметка


person Mark Buckley    schedule 26.04.2010    source источник
comment
Пожалуйста, укажите язык программирования.   -  person doublep    schedule 27.04.2010
comment
Пара вещей. Во-первых, AutoMapper ожидает, что в целевом типе нет аргументов. Далее, можете ли вы опубликовать, как выглядит адрес?   -  person Jimmy Bogard    schedule 27.04.2010
comment
Обратитесь к автоматически сгенерированному классу LINQ to SQL, созданному, когда я поместил таблицу в конструктор... Это довольно большой класс... сколько из него нужно видеть? -ОТМЕТКА-   -  person Mark Buckley    schedule 28.04.2010
comment
Прочитав еще немного сегодня утром, я думаю, вы сказали, что я не могу использовать AutoMapper в этой ситуации, потому что оба метода в моей модели представления (GetOneAddressByDistrictGuid и GetZipCodes) требуют передачи параметра, а AutoMapper не поддерживает эту функциональность, это правильно? Если это так, что вы можете предложить?   -  person Mark Buckley    schedule 28.04.2010
comment
Поскольку ни одно из свойств исходного класса AddressEditViewModel не соответствует свойствам целевого класса Address, я предлагаю вообще не использовать AutoMapper. Возможно, вам следует создать метод GetAddress() и создать свой собственный объект Address.   -  person Jaider    schedule 18.11.2015


Ответы (1)


Итак, я вижу несколько вещей, которые вы делаете, которые, вероятно, не помогут.

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

  1. Свойства называются "Получить...", что для меня больше похоже на метод.
  2. Сеттеры ваших свойств являются частными, поэтому AutoSetter не сможет их найти. Измените их на минимум внутренних.
  3. Использование параметризованного конструктора больше не требуется, когда вы используете AutoMapper, поскольку вы напрямую конвертируете один объект в другой. Параметризованный конструктор предназначен в основном для того, чтобы показать, что явно требуется этому объекту.

    CreateMap<Address, AddressEditViewModel>()
             .ForMember( x => x.GetOneAddressByDistrictGuid , 
                              o => o.MapFrom( m => m."GetOneAddressByDistrictGuid") )
             .ForMember( x => x.GetZipCodes, 
                              o => o.MapFrom( m => m."GetZipCodes" ) );
    

Automapper действительно хорош для копирования из DataObjects в объекты POCO или объекты View Model.

    public class AddressViewModel
    {
              public string FullAddress{get;set;}
    }

    public class Address
    {
              public string Street{get;set;}
              public string Suburb{get;set;}        
              public string City{get;set;}
    }

    CreateMap<Address, AddressViewModel>()
             .ForMember( x => x.FullAddress, 
                              o => o.MapFrom( m => String.Format("{0},{1},{2}"), m.Street, m.Suburb, m.City  ) );

    Address address = new Address(){
        Street = "My Street";
        Suburb= "My Suburb";
        City= "My City";
    };

    AddressViewModel addressViewModel = Mapper.Map(address, Address, AddressViewModel); 
person Dave Walker    schedule 02.06.2011