2010-09-01 14 views
10

Ich habe Probleme beim Einfügen von AutoMapper in eine ASP.NET MVC 2-Anwendung mit Ninject. Ich habe Jimmy Bogards Beitrag auf AutoMapper and StructureMap type Configuration als Leitfaden verwendet.Injection AutoMapper Abhängigkeiten mit Ninject

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 löst eine Ausnahme aus, wenn Configuration aufgelöst wird.

Fehler beim Aktivieren von IObjectMapper Keine passenden Bindungen sind verfügbar, und der Typ ist nicht selbstbindbar. Aktivierungspfad:
3) Injektion von Abhängigkeits IObjectMapper in den Parameter Mapper der Konstruktor des Typs Konfiguration

aktualisieren

Dieser arbeitet nun mit der folgenden Bindung:

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

I veröffentlichte das Modul auf GitHub. AutoMapper.Ninject. Weitere Informationen auf meinem Blog: http://binaryspeakeasy.com/2010/09/automapper-ninject/

+0

Siehe auch http://stackoverflow.com/a/1810728/11635 –

Antwort

1

Ich habe es funktioniert, aber es fühlt sich nicht sehr sauber erstellen eine Instanz der Configuration-Klasse. Irgendwelche Vorschläge, um es weiter zu reinigen.

 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

am besten, um dies in Ihre Frage zu bearbeiten. Im Allgemeinen würde ich sagen, dass Sie 'Bind () verwenden. ToMethod (c => c.Kernel.Get ()'. Verwenden Sie einfach "Bind (). Zu ()' –

+1

Dito 'binden (). ToConstant (neue Konfiguration (Kernel.Get (), MapperRegistry.AllMappers())). InSingletonScope(); 'sollte zu' .To <>. WithConstructorArgument' .... –

2

Es könnte auch eine gute Idee sein, eine Mapping-Fassade einzuführen. Anstatt IMapingEngine durch Ihren Code zu leiten, erstellen Sie eine IObjectMapper-Schnittstelle. Die Schnittstelle, die ich verwende, enthält Methodensignaturen, die direkt aus dem Auto-Mappers-Code stammen.

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); 
} 

Ihre Konfiguration wird immer noch autoadapterabhängig sein.

Eine Blog-Post ich es geschrieben habe, ist hier: http://fodonnel.wordpress.com/2010/09/20/an-object-mapper-facade/

+0

Der Blog-Link ist tot. – mlhDev

11

Sie können dies mit einer der neuesten Version (derzeit 2.2.0) mit einer Auskleidung ist.

Als Extra, I mit fodonnel, das Hinzufügen einer Fassade stimmen die AutoMapper Schnittstelle ist eine gute Idee, sich zu verstecken, aber ich würde die Unterschriften von AutoMapper direkt nicht nehmen, es sei denn, Sie diese Funktionalität alle brauchen.

Verwandte Themen