2010-09-01 241 views
10

我在使用Ninject將AutoMapper注入ASP.NET MVC 2應用程序時遇到問題。我用吉米博加德的文章AutoMapper and StructureMap type Configuration作爲指導。使用Ninject注入AutoMapper依賴關係

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的注入型配置的構造函數的參數映射器

更新

現在,這是使用以下綁定工作:

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/

+0

請參閱http://stackoverflow.com/a/1810728/11635 – 2012-06-12 06:21:30

回答

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>(); 
+1

最好將其編輯爲您的問題。一般來說,我會說你過度使用Bind ().ToMethod(c => c.Kernel.Get ()'。只需使用'Bind ()。到()' – 2010-09-02 08:01:18

+1

同上'綁定<配置>()。ToConstant(新配置(Kernel.Get (),MapperRegistry.AllMappers()))。InSingletonScope();'應該映射到'.To <>。WithConstructorArgument' .... – 2010-09-02 08:09:17

2

這也可能是一個好主意,介紹一個映射門面。代替將IMappingEngine傳入您的代碼中創建一個IObjectMapper接口。我使用的接口包含直接從自動加載程序代碼中取出的方法簽名。

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/

+0

博客鏈接已經死了。 – mlhDev 2016-10-19 15:11:21

11

你可以做到這一點是使用最新版本(目前2.2.0)一一行。

作爲一個額外的,我也有fodonnel同意,增加了門面隱藏Automapper接口是一個好主意,但是我不會從Automapper直接拿簽名,除非你需要所有的功能。