.net asp.net-mvc-2 ninject automapper bootstrapping

.net - Inyectar dependencias de AutoMapper usando Ninject



asp.net-mvc-2 bootstrapping (3)

Tengo problemas para inyectar AutoMapper en una aplicación ASP.NET MVC 2 utilizando Ninject. Utilicé la publicación de Jimmy Bogard en AutoMapper y StructureMap tipo Configuración como guía.

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 lanza una excepción al resolver Configuration .

Error al activar IObjectMapper No hay enlaces coincidentes disponibles, y el tipo no se puede encuadernar por sí mismo. Ruta de activación:
3) Inyección de la dependencia IObjectMapper en mapeadores de parámetros del constructor de tipo Configuración

Actualizar

Esto ahora funciona con el siguiente enlace:

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

Publiqué el módulo en GitHub. AutoMapper.Ninject . Más información en mi blog: http://binaryspeakeasy.com/2010/09/automapper-ninject/


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


También podría ser una buena idea presentar 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 seguirá siendo dependiente de Automapper.

Una publicación de blog que escribí está aquí: http://fodonnel.wordpress.com/2010/09/20/an-object-mapper-facade/


Puede hacer esto es un trazador de líneas utilizando la última versión (actualmente 2.2.0).

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

Como extra, estoy de acuerdo con fodonnel, agregar una fachada para ocultar la interfaz de Automapper es una buena idea, sin embargo, no tomaría las firmas directamente de Automapper, a menos que necesite toda esa funcionalidad.