Этот ответ основан на вашей исходной редакции , в которую был включен дополнительный код
Если вы посмотрите статью Джимми Богарда о Automapper и IOC , он заметит следующее:
MappingEngine, в отличие от нашего объекта конфигурации, не нуждается в каких-либо
специальное кеширование / поведение на всю жизнь. MappingEngine очень
легкий, потому что это действительно куча методов, делающих интересные
вещи с конфигурацией. MappingEngine может быть singleton, если мы хотим,
но в этом нет необходимости.
(Обновленный пример кода IOC для последней версии Automapper на github )
Пока ваш ConfigurationStore
является синглтоном и запрашивает IConfiguration
и IConfigurationProvider
из вашего DI-контейнера для разрешения этого экземпляра синглтона, в статье (и примерах кода) рекомендуется, чтобы можно было создавать новые экземпляры MappingEngine
при введении.
Исходя из вышеизложенного, кроме того, что вы не зарегистрировали ConfigurationStore
как одноэлементный экземпляр (я полагаю, я не знаком с ninject) и не связали этот экземпляр с IConfiguration
вашей окончательной реализацией MappingProfile
в Ваша первоначальная ревизия на самом деле является приемлемым решением. Это нормально, если это не тот же экземпляр MappingEngine
.
Однако, следуя вашему примеру использования в вашем вопросе, возможно, стоит рассмотреть Сценарий 2 в статье. Если у вас нет требований внедрять конфигурацию в ваше приложение и только IMappingEngine
, тогда вы можете положиться на статический класс Mapper
для управления конфигурацией и временем жизни. В итоге ваши изменения, чтобы принять это будет:
Удалите IConfigurationProvider
связанную проводку в сборке вашего контейнера (в MappingModule
).
Переключение MappingProfile
на статический Mapper
класс
CreateMap<Order, OrderModel>()
.ConvertUsing(o => new OrderModel(
o.Id,
o.ShippingAddress,
Mapper.Map<IList<OrderItemModel>>(o.Items) //use static Mapper class
));
CreateMap<OrderItem, OrderItemModel>();
Добавление Profile
к Mapper
(возможно, к MappingModule
?) И выполнение любой другой конфигурации через Mapper
:
Mapper.AddProfile(new MappingProfile());
Связывание IMappingEngine
в вспомогательном контейнере со свойством Mapper.Engine
.