AutoMapper: mapeamento entre um objeto IDataReader e DTO
Eu tenho um DataReader que contém o resultado de um procedimento armazenado. A convenção de nomenclatura para as colunas usa sublinhados para espaços.
Eu consegui mapear com êxito entre IDataReader e IEnumerable, mas somente se os campos corresponderem exatamente. Eu não quero a convenção de nomenclatura usada nos procedimentos armazenados para ditar a maneira que eu nomeia campos em meus objetos. E o mesmo é verdade no lado do banco de dados. Eu não acho que seria bem-sucedido impondo o Pascal Case aos DBAs.
Eu gostaria de evitar ter que usar ForMember () foreach campo eu preciso mapear. Isso frustraria o propósito de usar o AutoMapper.
Achei umpostagem anterior sobre o tópico que usei como referência em meus testes. Eu não consegui obter a configuração correta / mapeamento para o teste passar com êxito. Eu espero que alguém possa ajudar.
public class DataReaderTests
{
private DTOObject _result;
private IDataReader _dataReader;
protected override void Establish_context()
{
Mapper.Initialize(cfg =>
{
cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
cfg.CreateMap<IDataReader, IEnumerable<DTOObject>>();
});
_dataReader = new DataBuilder().BuildDataReader();
_result = Mapper.Map<IDataReader, IEnumerable<DTOObject>>(_dataReader).FirstOrDefault();
}
[Test]
public void Then_a_column_containing_phone_number_should_be_read()
{
Assert.That(_result.PhoneNumber, Is.EqualTo(_dataReader[FieldName.PhoneNumber]));
}
}
public class DataBuilder
{
public IDataReader BuildDataReader()
{
var resultData = new DataTable();
resultData.Columns.Add(FieldName.PhoneNumber, typeof(string));
var resultDataRow = resultData.NewRow();
resultDataRow[FieldName.PhoneNumber] = "111-222-3333";
resultData.Rows.Add(resultDataRow);
return resultData.CreateDataReader();
}
}
internal class FieldName
{
public const String Id = "id";
public const String Name = "name";
public const String PhoneNumber = "phone_number";
public const String CreateDate = "create_date";
}
public class DTOObject
{
public Guid Id { get; set; }
public string Name { get; set; }
public string PhoneNumber { get; set; }
public DateTime CreatedDate { get; set; }
}