如何配置要使用Ninject 2.0注入的Automapper?

时间:2010-08-03 22:43:34

标签: .net ninject automapper

Structure Map和Windsor有配置示例: http://www.cprieto.com/index.php/2009/08/20/using-automapper-with-castle-windsor/

但我没有为Ninject找到任何东西。

你知道如何将这些映射转换为Ninject吗?

2 个答案:

答案 0 :(得分: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的原因与Windsor不同,Ninject不提供任何一流的绑定支持多个接口到单个目标范围,因此这个黑客。

这就是它的全部内容。在IConfiguration(如果你想创建新地图)和/或IMappingEngine(实际进行映射)中编写依赖项的容器类,Ninject会毫无问题地注入它们。

如果你想进行超松散耦合并在其自己的类中定义每个映射,那么你可能想看看Ninject的Conventions Extension,它可以进行类似于温莎的FromAssembly。这也可以加载您可能在单独的库中定义的任何自定义IObjectMapper类。

答案 1 :(得分:2)

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