2010-08-03 68 views

回答

2
public class AutoMapperModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IMappingEngine>().ToMethod(ctx => Mapper.Engine); 
    } 
} 
5

这真的很容易,只需加载该模块:

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然后方法结合IConfigurationIConfigurationProvider是不像温莎,Ninject不提供多个接口结合到单个目标范围,因此,本hack任何一流的支持。

这就是它的全部。用IConfiguration(如果您想创建新地图)和/或IMappingEngine(实际执行映射)编写您的容器类,并且Ninject将注入它们而不会有任何问题。

如果您想要进行超松散耦合并且在其自己的类中定义了所有映射,那么您可能需要查看用于Ninject的Conventions Extension,它可以执行类似于Windsor的FromAssembly的组装扫描。这也可以加载你可能在一个单独的库中定义的任何自定义IObjectMapper类。

+1

你是否曾经有过一个AutoMapper v2模块敲入和/或单线程来解释这种类型的策略是否适用于v2? – 2012-06-12 07:22:27

+1

@RubenBartelink:你有没有试过把'Configuration'改成'ConfigurationStore'?我认为这是v2中唯一相关的变化;它实现了相同的'IConfiguration'接口,并接受与v1中'Configuration'相同的构造函数参数。 – Aaronaught 2012-06-13 23:29:00

+0

认为'档案'也在混合。现在我有一组通过'Ninject.Extensions.Conventions'发现的东西,然后将它们送入Mapper.Initialize()。当我需要注入一个转换器/格式化器/这些被调用的任何一个时,可能会重新访问。希望@jbogard可能会产生一个规范文章和/或更新一两个关于v2的新抽象如何适合DI的方法,然后才会变得至关重要。正在用反编译器进行分析;需要阅读测试(至少如果Ninject的最佳方式是如何实现的话)。现在,ta为你的回应和这个答案。 – 2012-06-14 00:23:53