Как настроить пользовательское сопоставление 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
});
Другие вопросы по тегам