10

我无法使用 Ninject 将 AutoMapper 注入 ASP.NET MVC 2 应用程序。我使用 Jimmy Bogard 关于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/

4

3 回答 3

11

您可以这样做是使用最新版本(当前为 2.2.0)的一个衬里。

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

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

于 2012-10-11T14:55:05.810 回答
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/

于 2010-09-20T12:19:54.373 回答
1

我让它工作了,但是创建配置类的实例感觉不是很干净。任何进一步清理它的建议。

        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>();
于 2010-09-02T05:15:07.473 回答