2017-01-31 1 views
1

Таким образом, проблема довольно проста, но я просто не вижу способа решения.Более 1 Конфигурация AutoMapper в многопроектном решении

В моем решении у меня есть слой DAL (библиотека классов), слой DTO (библиотека классов) и проект MVC.

Идея состоит в том, что приложение MVC запрашивает элементы с уровня DTO, который, в свою очередь, получает элементы из слоя DAL. Достаточно просто.

В слое DTO у меня есть репозитории с контекстом для их управления. Таким образом, приложение MVC создает экземпляр контекста DTO, а затем получает объекты DTO из соответствующего репозитория.

Теперь о проблеме.

В слое DTO я использую AutoMapper для сопоставления базовых объектов с DTO, а в приложении MVC я планировал снова использовать его для сопоставления DTO с ViewModels и обратно.

Итак, в конструкторе контекста на уровне DTO я вызываю статический RegisterMappings() для регистрации сопоставлений между базовыми объектами и DTO. На данный момент проблем нет.

Однако в Global.asax из приложения MVC Я также призываю RegisterMappings() (из другого класса к одному в слое DTO) еще при попытке сопоставить с ViewModel к DTO в приложении MVC я получаю Missing type map configuration or unsupported mapping исключение.

При рассмотрении исключений, вызванных AssertConfigurationIsValid() Я вижу, что automapper по-прежнему ищет сопоставления между слоями DAL и DTO, а не слоями приложений DTO и MVC, как ожидалось.

Как я могу использовать automapper в двух отдельных проектах в рамках одного и того же решения, не получая этот эффект «кровоточащих» отображений?

Любые идеи очень ценятся.

+1

Вы используете AutoMapper 5 или новее? Тогда я думаю, что вы можете хранить каждую конфигурацию отдельно, а не использовать статические вызовы «Mapper», используйте 'config.CreateMapper();' для создания сопоставления для каждого уровня. – stuartd

+0

@stuartd измените это на ответный парень. Отлично работал для меня. –

+0

Выполнено, спасибо ... – stuartd

ответ

1

Вы можете сохранить отображения отдельно, сохраняя конфигурацию AutoMapper в каждом проекте, а затем, используя конфигурацию, чтобы создать Mapper:

// DTO project 
MapperConfiguration dtoConfig; 

dtoConfig = new MapperConfiguration(cfg => { 
    cfg.CreateMap<Foo, Bar>(); 
    cfg.AddProfile<DtoProfile>(); 
}); 

// MVC project 
MapperConfiguration mvcConfig; 

mvcConfig = new MapperConfiguration(cfg => { 
    cfg.CreateMap<Foo, Bar>(); 
    cfg.AddProfile<MvcProfile>(); 
}); 

Затем, когда вы хотите отобразить класс, используйте соответствующие конфигурации для создать блок развертки:

var mapper = mvcConfig.CreateMapper(); 
mapper.Map<Foo, Bar>(foo); 
Смежные вопросы