2010-09-01 20 views
10

Tengo problemas para inyectar AutoMapper en una aplicación ASP.NET MVC 2 usando Ninject. Utilicé la publicación de Jimmy Bogard en AutoMapper and StructureMap type Configuration como guía.dependencias Inyectar AutoMapper utilizando 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 se emite una excepción al resolver Configuration.

Error al activar IObjectMapper No hay enlaces coincidentes disponibles, y el tipo no es autoblinable. camino Activación:
3) Inyección de dependencia IObjectMapper en mapeadores de parámetros de constructor de configuración tipo

actualización

Esto ahora está trabajando usando el siguiente unión:

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 publicó el módulo en GitHub. AutoMapper.Ninject. Más información en mi blog: http://binaryspeakeasy.com/2010/09/automapper-ninject/

+0

Consulte también http://stackoverflow.com/a/1810728/11635 –

Respuesta

1

Lo tengo funcionando, pero no me siento muy limpio creando una instancia de la clase de Configuración. Cualquier sugerencia para limpiarlo más.

 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

para editar esto en su pregunta. En general, diría que está usando en exceso 'Bind () .ToMethod (c => c.Kernel.Get ()' Solo use 'Bind () .A ()' –

+1

Ditto 'Bind () ToConstant (nueva configuración (Kernel.Get (), MapperRegistry.AllMappers())) InSingletonScope (.), '' debe asignar a .Para <> WithConstructorArgument' .... –

2

También podría ser una buena idea introducir una fachada de mapeo. En lugar de pasar IMappingEngine a través de su código, cree una interfaz IObjectMapper. La interfaz que uso contiene firmas de métodos tomadas directamente del código de 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); 
} 

Su configuración es todavía va a ser AutoMapper dependiente.

un post que escribí sobre ella está aquí: http://fodonnel.wordpress.com/2010/09/20/an-object-mapper-facade/

+0

El enlace del blog. está muerto. – mlhDev

11

Puede hacer esto es un chiste utilizando la versión más reciente (actualmente 2.2.0).

Como extra, estoy de acuerdo con fodonnel, añadiendo una fachada para ocultar la interfaz AutoMapper es una buena idea, sin embargo no llevar a las firmas directamente de AutoMapper, a menos que necesite toda esa funcionalidad.

Cuestiones relacionadas