.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.