使用Ninject注入AutoMapper依赖项

时间:2010-09-01 04:44:43

标签: .net asp.net-mvc-2 ninject automapper bootstrapping

我无法使用Ninject将AutoMapper注入ASP.NET MVC 2应用程序。我在AutoMapper and StructureMap type Configuration上使用Jimmy Bogard的帖子作为指南。

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 个答案:

答案 0 :(得分:11)

您可以使用最新版本(目前为2.2.0)进行单线程。

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

作为额外的,我同意fodonnel,添加一个外观以隐藏Automapper界面是一个好主意,但是我不会直接从Automapper中获取签名,除非你需要所有这些功能。

答案 1 :(得分:2)

引入映射外观可能也是一个好主意。而不是通过代码传递IMappingEngine创建一个IObjectMapper接口。我使用的接口包含直接从automappers代码中获取的方法签名。

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/

答案 2 :(得分:1)

我得到了它的工作,但创建一个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>();