Как настроить пользовательское сопоставление Dapper Extensions с Structuremap?
Я использую Dapper Extensions для создания своих репозиториев в приложении MVC, которое настроено на использование Structuremap. Для одной из моделей мне нужно создать собственное отображение, чтобы игнорировать поле.
public class ServiceMapper : ClassMapper<Service>
{
public ServiceMapper()
{
//Ignore this property entirely
Map(x => x.IsRunningNormally).Ignore();
//optional, map all other columns
AutoMap();
}
}
Теперь, чтобы вызвать этот маппер, мне нужно его настроить, я вызываю эту строку кода в конструкторе моего репозитория.
DapperExtensions.DapperExtensions.DefaultMapper = typeof(ServiceMapper);
Как только я нажимаю на эту строку, Structuremap пытается определить тип и выдает исключение:
ServiceMonitor.Infrastructure.ServiceMapper не является определением GenericTypeDefinition. MakeGenericType может быть вызван только для типа, для которого Type.IsGenericTypeDefinition имеет значение true.
Я не уверен, что означает эта ошибка и как ее устранить? Кто-нибудь может подсказать мне, что здесь происходит?
2 ответа
Хорошо, так, наконец, разобрался с проблемой. Проблема заключается в том, что по умолчанию DapperExtensions сканирует все написанные вами пользовательские сопоставления в той же сборке, что и ваши классы POCO модели. В моем случае это была сборка DataTransferObjects.
Мой класс Mapper присутствовал в сборке репозитория, которая отличается от сборки DTO.
Мне нужно было сказать Dapper Extensions для сканирования этой сборки на предмет пользовательских сопоставлений:
DapperExtensions.DapperExtensions.DefaultMapper = typeof (ServiceMapper);
// Tell Dapper Extension to scan this assembly for custom mappings
DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]
{
typeof (ServiceMapper).Assembly
});
После того, как я установил, как указано выше, мой код начал работать. Это нигде не задокументировано, и мне понадобилось время, чтобы понять это. Надеюсь, что это поможет кому-то еще с той же проблемой.
Обратите внимание, что если вы используете асинхронные реализации, вам нужно зарегистрировать сборки сопоставления с помощью DapperAsyncExtensions:
DapperExtensions.DapperAsyncExtensions.DefaultMapper = typeof (ServiceMapper);
// Tell Dapper Extension to scan this assembly for custom mappings
DapperExtensions.DapperAsyncExtensions.SetMappingAssemblies(new[]
{
typeof (ServiceMapper).Assembly
});