2011-04-25 18 views
7

¿En qué parte de mi aplicación ASP.NET MVC debo definir mis asignaciones de AutoMapper?¿Dónde definir las asignaciones de AutoMapper?

Mapper.CreateMap<User, UserViewModel>(); 

Actualmente estoy definiendo éstas en el constructor de un BaseController, que todos mis Controlllers derivan de. ¿Es este el mejor lugar?

Respuesta

9

creo que es un poco tarde para responder a la pregunta, pero tal vez alguien pueda usar mi respuesta.

Uso Ninject para resolver dependencias, así que he creado el Módulo Ninject para AutoMapper. Aquí está el código:

public class AutoMapperModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IConfiguration>().ToMethod(context => Mapper.Configuration); 
     Bind<IMappingEngine>().ToMethod(context => Mapper.Engine); 

     SetupMappings(Kernel.Get<IConfiguration>()); 

     Mapper.AssertConfigurationIsValid(); 
    } 

    private static void SetupMappings(IConfiguration configuration) 
    { 
     IEnumerable<IViewModelMapping> mappings = typeof(IViewModelMapping).Assembly 
      .GetExportedTypes() 
      .Where(x => !x.IsAbstract && 
         typeof(IViewModelMapping).IsAssignableFrom(x)) 
      .Select(Activator.CreateInstance) 
      .Cast<IViewModelMapping>(); 

     foreach (IViewModelMapping mapping in mappings) 
      mapping.Create(configuration); 
    } 
} 

Como se puede ver en la carga que escanea montaje para implementaion de IViewModelMapping y luego corre Crear método.

Aquí está el código de IViewModelMapping:

interface IViewModelMapping 
{ 
    void Create(IConfiguration configuration); 
} 

implementación típica de IViewModelMapping se ve así:

public class RestaurantMap : IViewModelMapping 
{ 
    public void Create(IConfiguration configuration) 
    { 
     if (configuration == null) 
      throw new ArgumentNullException("configuration"); 

     IMappingExpression<RestaurantViewModel, Restaurant> map = 
      configuration.CreateMap<RestaurantViewModel, Restaurant>(); 
// some code to set up proper mapping 

     map.ForMember(x => x.Categories, o => o.Ignore()); 
    } 
} 
0

El código que está consultando se parece a AutoMapper, no a StructureMap.

Si está utilizando el método estático Mapper , configuración sólo tiene que ocurra una vez por dominio de aplicación. Eso significa que el mejor lugar para poner el código de configuración es en la aplicación de inicio, como el archivo Global.asax para aplicaciones ASP.NET. Normalmente, la clase de configuración bootstrapper pertenece a su propia clase, y esta clase de bootstrapper se llama desde el método de inicio .

http://automapper.codeplex.com/wikipage?title=Getting%20Started&referringTitle=Home

+0

Ugh, soy un idiota. Me refería a AutoMapper. Demasiada medicina para la tos. Actualizado mi pregunta. –

1

Como se mencionó en this answer, AutoMapper ha introducido la configuración profiles para organizar su configuración de asignación.

Así, por ejemplo, se podría definir una clase para configurar su configuración de asignación:

public class ProfileToOrganiseMappings : Profile 
{ 
    protected override void Configure() 
    { 
     Mapper.CreateMap<SourceModel, DestinationModel>(); 
     //other mappings could be defined here 
    } 
} 

Y luego definir una clase para inicializar las asignaciones:

public static class AutoMapperWebConfiguration 
{ 
    public static void Configure() 
    { 
     Mapper.Initialize(cfg => 
     { 
      cfg.AddProfile(new ProfileToOrganiseMappings()); 
      //other profiles could be registered here 
     }); 
    } 
} 

Y, por último, llama a eso clase en su global.asax Application_Start() para configurar esas asignaciones:

protected void Application_Start() 
{ 
    ... 
    AutoMapperWebConfiguration.Configure(); 
} 
Cuestiones relacionadas