Saltar al contenido

Cómo configurar Automapper en ASP.NET Core

Nuestro team de expertos despúes de varios días de investigación y de recopilar de datos, hallamos la respuesta, deseamos que resulte de utilidad para tu plan.

Solución:

¡Me lo imaginé! Aquí están los detalles:

  1. Agregue el paquete AutoMapper principal a su solución a través de NuGet.

  2. Agregue el paquete de inyección de dependencia de AutoMapper a su solución a través de NuGet.

  3. Cree una nueva clase para un perfil de mapeo. (Hice una clase en el directorio principal de la solución llamada MappingProfile.cs y agregue el siguiente código.) Usaré un User y UserDto objeto como ejemplo.

     public class MappingProfile : Profile 
         public MappingProfile() 
             // Add as many of these lines as you need to map your objects
             CreateMap();
             CreateMap();
         
     
    
  4. Luego agregue AutoMapperConfiguration en el Startup.cs Como se muestra abajo:

     public void ConfigureServices(IServiceCollection services) 
         // .... Ignore code before this
    
        // Auto Mapper Configurations
         var mapperConfig = new MapperConfiguration(mc =>
         
             mc.AddProfile(new MappingProfile());
         );
    
         IMapper mapper = mapperConfig.CreateMapper();
         services.AddSingleton(mapper);
    
         services.AddMvc();
    
     
    
  5. Para invocar el objeto mapeado en el código, haga algo como lo siguiente:

     public class UserController : Controller 
    
         // Create a field to store the mapper object
         private readonly IMapper _mapper;
    
         // Assign the object in the constructor for dependency injection
         public UserController(IMapper mapper) 
             _mapper = mapper;
         
    
         public async Task Edit(string id) 
    
             // Instantiate source object
             // (Get it from the database or whatever your code calls for)
             var user = await _context.Users
                 .SingleOrDefaultAsync(u => u.Id == id);
    
             // Instantiate the mapped data transfer object
             // using the mapper you stored in the private field.
             // The type of the source object is the first type argument
             // and the type of the destination is the second.
             // Pass the source object you just instantiated above
             // as the argument to the _mapper.Map<>() method.
             var model = _mapper.Map(user);
    
             // .... Do whatever you want after that!
         
     
    

¡Espero que esto ayude a alguien a comenzar de nuevo con ASP.NET Core! Agradezco cualquier comentario o crítica ya que todavía soy nuevo en el mundo .NET.

Paso para usar AutoMapper con ASP.NET Core.

Paso 1. Instalar AutoMapper.Extensions.Microsoft.DependencyInjection desde el paquete NuGet.

ingrese la descripción de la imagen aquí

Paso 2. Cree una carpeta en la solución para mantener las asignaciones con el nombre “Asignaciones”.

ingrese la descripción de la imagen aquí

Paso 3. Después de agregar la carpeta de mapeo, hemos agregado una clase con el nombre “MappingProfile“Este nombre puede ser algo único y bueno de entender.

En esta clase, vamos a mantener todas las asignaciones.

ingrese la descripción de la imagen aquí

Paso 4. Inicialización de Mapper en el inicio “ConfigureServices”

En la clase de inicio, necesitamos inicializar el perfil que hemos creado y también registrar el servicio AutoMapper.

  Mapper.Initialize(cfg => cfg.AddProfile());

  services.AddAutoMapper();

Fragmento de código para mostrar el método ConfigureServices donde necesitamos inicializar y registrar AutoMapper.

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 


    public void ConfigureServices(IServiceCollection services)
    
        services.Configure(options =>
        
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        );


        // Start Registering and Initializing AutoMapper

        Mapper.Initialize(cfg => cfg.AddProfile());
        services.AddAutoMapper();

        // End Registering and Initializing AutoMapper

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    

Paso 5. Obtenga resultados.

Para obtener el resultado mapeado, debemos llamar a AutoMapper.Mapper.Map y pasar el destino y la fuente adecuados.

AutoMapper.Mapper.Map(source);

Fragmento de código

    [HttpPost]
    public void Post([FromBody] SchemeMasterViewModel schemeMaster)
    
        if (ModelState.IsValid)
        
            var mappedresult = AutoMapper.Mapper.Map(schemeMaster);
        
    

Quiero extender las respuestas de @ theutz, a saber, esta línea:

// services.AddAutoMapper(typeof(Startup));  // <-- newer automapper version uses this signature.

Hay un errorprobablemente) en AutoMapper.Extensions.Microsoft.DependencyInjection versión 3.2.0. (Estoy usando .NET Core 2.0)

Esto se aborda en este problema de GitHub. Si sus clases que heredan la clase de perfil de AutoMapper existen fuera del ensamblaje donde se encuentra su clase de inicio, probablemente no se registrarán si su inyección de AutoMapper se ve así:

services.AddAutoMapper();

a menos que especifique explícitamente qué ensamblados buscar perfiles de AutoMapper.

Se puede hacer así en su Startup.ConfigureServices:

services.AddAutoMapper( or );

dónde "Ensambles" y "type_in_assemblies" apunte al ensamblado donde se especifican las clases de perfil en su aplicación. P.ej:

services.AddAutoMapper(typeof(ProfileInOtherAssembly), typeof(ProfileInYetAnotherAssembly));

I suponer (y pongo énfasis en esta palabra) que debido a la siguiente implementación de sobrecarga sin parámetros (código fuente de GitHub):

public static IServiceCollection AddAutoMapper(this IServiceCollection services)

     return services.AddAutoMapper(null, AppDomain.CurrentDomain.GetAssemblies());

confiamos en que CLR ya tiene un ensamblaje JITed que contiene perfiles de AutoMapper que pueden ser o no true ya que solo se alteran cuando es necesario (más detalles en esta pregunta de StackOverflow).

Si guardas algún reparo o capacidad de limar nuestro post eres capaz de añadir una interpretación y con placer lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *