Возможно ли проецирование по соглашению с AutoMapper? - PullRequest
1 голос
/ 02 марта 2012

У меня есть следующие данные, возвращенные из моей базы данных:

Number, AddressStreet, AddressCity, AddressState

Мои доменные объекты выглядят следующим образом:

public class Order
{
    public Address Address { get; set; }
    public String Number { get; set; }
}

public class Address
{
    public String City { get; set; }
    public String State { get; set; }
    public String Street { get; set; }
}

Используя встроенный DataReaderMapper, отображение из IDataReader, содержащееданные базы данных просты, за исключением того, что я не могу заполнить объект Address.

В идеале я хотел бы использовать DynamicMap следующим образом:

var order = Mapper.DynamicMap<Order>(dataReader);

Когда я это сделаю, упорядочите.Номер заполнен, но порядок. Адрес нулевой.Когда я создаю новый экземпляр класса Address в конструкторе Order, он не равен нулю (как и ожидалось), но ни одно из свойств не установлено.

Я пробовал:

Mapper.CreateMap<IDataReader, Order>()
      .ForMember(target => target.Address, opt => opt.MapFrom(src => src));

иизменил имена столбцов на простые "Улица", "Город" и "Штат", но безуспешно.

Я пробовал:

Mapper.CreateMap<IDataReader, Address>();
Mapper.CreateMap<IDataReader, Order>()
      .ForMember(target => target.Address, opt => opt.UseDestinationValue());

и все их комбинации.Я даже указал ForMembers для каждого свойства в Address.Ничего не помогло.

Я знаю, что AutoMapper поддерживает выравнивание по соглашению, я могу только предположить, исходя из того, что я нахожу, что проекция по соглашению (где он распознает, что AddressStreet должен быть сопоставлен с Address.Street) невозможна.Я не прав?

Как мне заставить работать приведенный выше пример ???

ОБНОВЛЕНИЕ

Мы смогли заставить его работатьиспользуя:

Mapper.CreateMap<IDataReader, Order>()
    .ForMember(target => target.Address,
               opt => opt.MapFrom(src => Mapper.Map<Address>(src)));

Кажется, что это довольно грязно.

...