Как настроить Automapper для внедрения с Ninject 2.0?

Примеры конфигурации для Structure Map и Windsor: http://www.cprieto.com/index.php/2009/08/20/using-automapper-with-castle-windsor/

Но я ничего не нашел для Ninject.

Вы знаете, как перевести эти сопоставления в Ninject?


person David Lay    schedule 03.08.2010    source источник


Ответы (1)


Это действительно очень просто, просто загрузите этот модуль:

public class AutoMapperModule : NinjectModule
{
    public override void Load()
    {
        Bind<ITypeMapFactory>().To<TypeMapFactory>();
        foreach (var mapper in MapperRegistry.AllMappers())
            Bind<IObjectMapper>().ToConstant(mapper);
        Bind<Configuration>().ToSelf().InSingletonScope()
            .WithConstructorArgument("mappers",
                ctx => ctx.Kernel.GetAll<IObjectMapper>());
        Bind<IConfiguration>().ToMethod(ctx => ctx.Kernel.Get<Configuration>());
        Bind<IConfigurationProvider>().ToMethod(ctx => 
            ctx.Kernel.Get<Configuration>());
        Bind<IMappingEngine>().To<MappingEngine>();
    }
}

Несколько замечаний по этому поводу:

  • Вместо того, чтобы просто предоставить MapperRegistry.AllMappers в качестве аргумента конструктора для Configuration, он фактически идет и привязывает каждый отдельный IObjectMapper, а затем использует само ядро ​​для получения аргументов конструктора в привязке WithConstructorArgument. Причина этого в том, что вы можете загрузить свои собственные привязки IObjectMapper в ядро, если вы решите написать свои собственные мапперы.

  • Причина самопривязки Configuration, а затем привязки методов IConfiguration и IConfigurationProvider заключается в том, что, в отличие от Windsor, Ninject не предоставляет никакой первоклассной поддержки для привязки нескольких интерфейсов к одной целевой области, отсюда и этот хак.

Вот и все. Напишите свой класс-контейнер с зависимостями от IConfiguration (если вы хотите создавать новые карты) и/или IMappingEngine (для фактического отображения), и Ninject внедрит их без проблем.

Если вы хотите использовать сверхслабую связь и определить каждое сопоставление в своем собственном классе, вам, вероятно, следует взглянуть на Conventions Extension для Ninject, который может выполнять сканирование сборки аналогично FromAssembly Windsor. Это также может загружать любые пользовательские IObjectMapper классы, которые вы можете определить в отдельной библиотеке.

person Aaronaught    schedule 14.08.2011
comment
Возможно, у вас есть модуль AutoMapper v2, который стучит и / или одна строчка, объясняющая, жизнеспособна ли такая стратегия с v2? - person Ruben Bartelink; 12.06.2012
comment
@RubenBartelink: Вы пытались изменить Configuration на ConfigurationStore? Я думаю, что это единственное значимое изменение в v2; он реализует тот же интерфейс IConfiguration и принимает те же аргументы конструктора, что и Configuration в v1. - person Aaronaught; 14.06.2012
comment
Думаю, что Profile тоже присутствует. Прямо сейчас у меня есть набор из них, обнаруженный через Ninject.Extensions.Conventions, который я затем загружаю в Mapper.Initialize(). Вероятно, я вернусь, когда мне понадобится инъекция в конвертер/форматер/как бы он ни назывался. Надеясь, что @jbogard может выпустить каноническую статью и/или обновить параграф или два о том, как/какие из новых абстракций v2 подходят к DI, прежде чем это станет критическим. Анализировал декомпилятором; нужно прочитать тесты (по крайней мере, если это лучший способ понять Ninject). А пока спасибо за ваш ответ и этот ответ. - person Ruben Bartelink; 14.06.2012
comment
@RubenBartelink: я тоже использую профили, но я не вдавался в подробности здесь, потому что это не чистый код автомаппера / DI. Вместо этого я создал интерфейс IMapRegistration и запустил все реализующие классы при запуске. Все они берут IProfileExpression (все еще часть v2 API) в ctor, а затем я написал метод расширения с именем WithProfile для IBindingWithSyntax<IMapRegistration>, который просто создает профиль, используя WithConstructorArgument и вызывая метод CreateProfile для сохраняющего контекст IConfiguration get. Как-то муторно, но есть. - person Aaronaught; 14.06.2012
comment
Звучит достаточно аккуратно (хотя у меня нет центральной DLL для размещения такого интерфейса IMapRegistration, поэтому я решил использовать его напрямую. Я думаю, если бы у вас было время превратить свою технику в хороший, и вот как я это делаю с Ответ AM 2.0, чтобы сидеть рядом с этим, это было бы очень полезно :P А пока спасибо за то, что поделились соответствующими подробностями. - person Ruben Bartelink; 14.06.2012