AutoMapper TypeConverter не вызывается при отображении IDataReader
У меня есть несколько моделей, которые я хотел бы отобразить с помощью AutoMapper. Automapper настроен для сопоставления IDataReader с классом модели. Проблема заключается в том, что мне нужно иметь установленный ITypeConverter на моем картографе, чтобы я мог перечислять ограниченное количество раз для каждой модели. Я не хочу создавать много классов, наследуемых от ITypeConverter для каждой модели.
Пример модели:
public class Customer: IModel
{
public FirstName { get; set; }
public LastName { get; set; }
}
Класс Mapper:
public static class AutoMappingConfig
{
public static void Configure()
{
// I would have many other mappings like the one below. All taking an IDataReader and mapping to a model inheriting from IModel
Mapper.CreateMap<IDataReader, Customer>()
.ForMember(x => x.FirstName, o => o.MapFrom(s => s.GetString(s.GetOrdinal("first_name")))
.ForMember(x => x.LastName, o => o.MapFrom(s => s.GetString(s.GetOrdinal("last_name"))));
// I would have many of the following. All taking an IDataReader and mapping to an IEnumerable model object
Mapper.CreateMap<IDataReader, IEnumerable<Customer>>().ConvertUsing<ModelConverter<Customer>>();
}
}
Преобразователь:
public class ModelConverter<T>: ITypeConverter<IDataReader, IEnumerable<T>> where T: IModel
{
public IEnumerable<T> Convert(ResolutionContext context)
{
var dataReader = (IDataReader) context.SourceValue;
var rowCount = 0;
var collection = new List<T>();
// The purpose for this ModelConverter is the a maximum row count of 10
while (dataReader.Read() && rowCount < 10)
{
var item = Mapper.Map<IDataReader, T>(dataReader);
collection.Add(item);
rowCount++;
}
return collection;
}
}
Примечание: проблема не в классе ModelConverter, так как он никогда не вызывается, когда я передаю IDataReader. Я попробовал подобную систему сопоставления с другим классом, и она вызывается и успешно обрабатывает сопоставление.
Когда я запускаю следующий код, возвращаемое значение представляет собой список элементов с нулевыми сопоставлениями. Класс ModelConverter не вызывается вообще. Приведенный выше код работает для любого ввода, кроме IDataReader. AutoMapper делает что-то особенное с IDataReader, но я не уверен, что делать с ITypeConverter на этом этапе.
var customers = Mapper.Map<IDataReader, IEnumerable<Customer>>(dataReader);
В приведенном выше коде dataReader является объектом IDataReader.
1 ответ
Извините, преобразователи типов в настоящее время не поддерживаются для читателей данных.