Как настроить Automapper для впрыскивания с Ninject 2.0? - PullRequest
4 голосов
/ 04 августа 2010

Существуют примеры конфигурации для Структурной карты и Виндзора: http://www.cprieto.com/index.php/2009/08/20/using-automapper-with-castle-windsor/

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

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

Ответы [ 2 ]

5 голосов
/ 15 августа 2011

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

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 заключается в том, что в отличие от Виндзора, Ninject не предоставляет первоклассную поддержку для привязки нескольких интерфейсов к одной целевой области, отсюда и этот хак.1022 *

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

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

2 голосов
/ 19 августа 2012
public class AutoMapperModule : NinjectModule
{
    public override void Load()
    {
        Bind<IMappingEngine>().ToMethod(ctx => Mapper.Engine);
    }
}
...