2010-09-01 13 views
10

Mam problem z wstrzyknięciem AutoMappera do aplikacji ASP.NET MVC 2 przy użyciu programu Ninject. Użyłem postu Jimmy'ego Bogarda pod numerem AutoMapper and StructureMap type Configuration jako przewodnika.Wstrzykiwanie zależności AutoMapper za pomocą 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>(); 
    } 
} 

Firma Ninject zgłasza wyjątek podczas rozwiązywania Configuration.

Błąd aktywacji IObjectMapper Brak dostępnych powiązań, a typ nie jest samozłączalny. ścieżka Aktywacja:
3) Wstrzykiwanie zależności IObjectMapper do mappers parametrów konstruktora typu konfiguracji

Aktualizacja

ten pracuje obecnie przy użyciu następującej Oprawa:

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 opublikował moduł na GitHub. AutoMapper.Ninject. Więcej informacji na moim blogu: http://binaryspeakeasy.com/2010/09/automapper-ninject/

+0

Zobacz także http://stackoverflow.com/a/1810728/11635 –

Odpowiedz

1

Mam go działa, ale nie czuje się zbyt dobrze tworząc instancję klasy Configuration. Wszelkie sugestie, aby posprzątać dalej.

 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

najlepiej edytować to na swoje pytanie. Zasadniczo powiedziałbym, że nadużywasz 'Bind () .ToMethod (c => c.Kernel.Get ()'. Po prostu użyj 'Bind () .To ()' –

+1

Ditto 'Bind (). ToConstant (nowa konfiguracja (Kernel.Get (), MapperRegistry.AllMappers())) InSingletonScope(); 'powinien zamapować na' .To <>. WithConstructorArgument' .... –

2

Dobrym pomysłem może być wprowadzenie fasady odwzorowującej. Zamiast przechodzić przez IMappingEngine przez twój kod, stwórz interfejs IObjectMapper. Interfejs, którego używam, zawiera sygnatury metod pobrane bezpośrednio z kodu 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); 
} 

Twoja konfiguracja nadal będzie zależna od automappera.

posta na blogu pisałem o nim tutaj: http://fodonnel.wordpress.com/2010/09/20/an-object-mapper-facade/

+0

Link do bloga nie żyje. – mlhDev

11

Można zrobić to jeden liner przy użyciu najnowszej wersji (obecnie 2.2.0).

jako dodatkowy, zgadzam się z fodonnel, dodając fasadę, aby ukryć interfejs Automapper jest dobrym pomysłem, jednak nie miałaby podpisów bezpośrednio od Automapper, chyba że trzeba wszystkie te funkcje.

Powiązane problemy