Внедрение зависимостей AutoMapper с помощью Ninject - PullRequest
10 голосов
/ 01 сентября 2010

У меня проблемы с внедрением AutoMapper в приложение ASP.NET MVC 2 с использованием Ninject.Я использовал пост Джимми Богарда о AutoMapper и тип конфигурации StructureMap в качестве руководства.

public class AutoMapperModule : NinjectModule
{
    public override void Load()
    {
        Bind<ITypeMapFactory>().To<TypeMapFactory>();
        Bind<Configuration>().ToSelf().InSingletonScope().WithConstructorArgument("mapper", MapperRegistry.AllMappers);
        Bind<IConfiguration>().To<Configuration>();
        Bind<IConfigurationProvider>().To<Configuration>();
        Bind<IMappingEngine>().To<MappingEngine>();
    }
}

Ninject выдает исключение при разрешении Configuration.

Ошибкаактивация IObjectMapper Соответствующие привязки недоступны, а тип не является самосвязываемым.Путь активации:
3) Внедрение зависимости IObjectMapper в преобразователи параметров конструктора типа Configuration

Обновление

Теперь это работает с использованием следующей привязки:

    Bind<ITypeMapFactory>().To<TypeMapFactory>();
    Bind<Configuration>().ToConstant(new Configuration(Kernel.Get<ITypeMapFactory>(), MapperRegistry.AllMappers())).InSingletonScope();
    Bind<IConfiguration>().ToMethod(c => c.Kernel.Get<Configuration>());
    Bind<IConfigurationProvider>().ToMethod(c => c.Kernel.Get<Configuration>());
    Bind<IMappingEngine>().To<MappingEngine>();

Я опубликовал модуль на GitHub. AutoMapper.Ninject .Больше информации в моем блоге: http://binaryspeakeasy.com/2010/09/automapper-ninject/

Ответы [ 3 ]

11 голосов
/ 11 октября 2012

Вы можете сделать это одним вкладышем, используя последнюю версию (в настоящее время 2.2.0).

kernel.Rebind<IMappingEngine>().ToMethod(context => Mapper.Engine);

В качестве дополнения, я согласен с fodonnel, добавление фасада для скрытия интерфейса Automapper - хорошая идея, однако я бы не брал подписи непосредственно из Automapper, если вам не нужны все эти функции.

2 голосов
/ 20 сентября 2010

Также неплохо было бы представить картографический фасад. Вместо передачи IMappingEngine из вашего кода создайте интерфейс IObjectMapper. Интерфейс, который я использую, содержит сигнатуры методов, взятые непосредственно из кода autoppers.

public interface IObjectMapper
{ 
  TDestination Map(TSource source);
  TDestination Map(TSource source, TDestination destination);
  object Map(object source, Type sourceType, Type destinationType);
  object Map(object source, object destination, Type sourceType, Type destinationType);
}

Ваша конфигурация по-прежнему будет зависеть от автопроизводителя.

Сообщение в блоге, которое я написал об этом здесь: http://fodonnel.wordpress.com/2010/09/20/an-object-mapper-facade/

1 голос
/ 02 сентября 2010

У меня все работает, но не очень-то чисто, создавая экземпляр класса Configuration. Любые предложения, чтобы убрать это далее.

        Bind<ITypeMapFactory>().To<TypeMapFactory>();
        Bind<Configuration>().ToConstant(new Configuration(Kernel.Get<ITypeMapFactory>(), MapperRegistry.AllMappers())).InSingletonScope();
        Bind<IConfiguration>().ToMethod(c => c.Kernel.Get<Configuration>());
        Bind<IConfigurationProvider>().ToMethod(c => c.Kernel.Get<Configuration>());
        Bind<IMappingEngine>().To<MappingEngine>();
...