web-dev-qa-db-fra.com

Vous essayez d’ajouter AutoMapper à Asp.net Core 2?

J'ai travaillé sur un projet asp.net core 1.1 il y a quelque temps et l'utiliser dans le projet AutoMapper.

dans asp.net core 1.1, j'ajoute services.AddAutoMapper() dans le fichier de démarrage:

Fichier de démarrage dans asp.net core 1.1:

    public void ConfigureServices(IServiceCollection services)
    {
        //Some Code

        services.AddMvc();
        services.AddAutoMapper();
    }

Et j'utilise facilement AutoMapper dans Controller.

Contrôleur:

 public async Task<IActionResult> AddEditBook(AddEditBookViewModel model)
 {
    Book bookmodel = AutoMapper.Mapper.Map<AddEditBookViewModel, Book>(model);
    context.books.Add(bookmodel);
    context.SaveChanges();
 }

Et tout allait bien. Mais je travaille actuellement sur un projet Asp.net Core 2 et j'obtiens l'erreur avec services.AddAutoMapper() dans le fichier sturtap.

Erreur CS0121 L'appel est ambigu entre les méthodes ou propriétés suivantes: 'ServiceCollectionExtensions.AddAutoMapper (IServiceCollection, params Assembly [])' et 'ServiceCollectionExtensions.AddAutoMapper (IServiceCollection, params Type [])'

Quelle est la raison de cette erreur? En outre, services.AddAutoMapper Dans asp.net Core 2 a certains paramètres. Que dois-je envoyer à ce paramètre?

27
topcool

Vous avez probablement mis à jour vos dépendances ASP.NET Core, mais vous utilisiez toujours la version obsolète AutoMapper.Extensions.Microsoft.DependencyInjection paquet.

Pour ASP.NET Core, vous devez disposer au minimum de la version 3.0.1 de https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/3.0.1

Quelles références AutoMapper 6.1.1 ou supérieur.

AutoMapper (> = 6.1.1)

Microsoft.Extensions.DependencyInjection.Abstractions (> = 2.0.0)

Microsoft.Extensions.DependencyModel (> = 2.0.0)

Les anciens paquets dépendent de Microsoft.Extensions.DependencyInjection.Abstractions1.1.0 et ne peut pas être utilisé avec ASP.NET Core car des modifications importantes ont été apportées entre Microsoft.Extensions.DependencyInjection.Abstractions 1.1.0 et 2.0

14
Tseng

Si vous utilisez AspNet Core 2.2 et AutoMapper.Extensions.Microsoft.DependencyInjection v6.1, vous devez utiliser le fichier de démarrage.

services.AddAutoMapper(typeof(Startup));
78
dev-siberia

Dans la nouvelle version (6.1) de AutoMapper.Extensions.Microsoft.DependencyInjection nuget package, vous devez l’utiliser comme suit:

services.AddAutoMapper(Type assemblyTypeToSearch);
// OR
services.AddAutoMapper(params Type[] assemblyTypesToSearch);
8
Mohammad Dayyan

Aucun de ceux-ci n'a fonctionné pour moi, j'ai un projet .NET Core 2.2 et le code complet pour configurer le mappeur ressemble à ceci ( fait partie de la méthode ConfigureService () ):

    // Auto Mapper Configurations
    var mappingConfig = new MapperConfiguration(mc =>
    {
        mc.AddProfile(new SimpleMappings());
    });

    IMapper mapper = mappingConfig.CreateMapper();
    services.AddSingleton(mapper);

Ensuite, j'ai mon cours de mappage que j'ai placé dans le projet BL:

public class SimpleMappings : Profile
    {
        public SimpleMappings()
        {
            CreateMap<DwUser, DwUserDto>();
            CreateMap<DwOrganization, DwOrganizationDto>();
        }
    }

Et enfin, l'utilisation du mappeur ressemble à ceci:

public class DwUserService : IDwUserService
    {
        private readonly IDwUserRepository _dwUserRepository;
        private readonly IMapper _mapper;

        public DwUserService(IDwUserRepository dwUserRepository, IMapper mapper)
        {
            _dwUserRepository = dwUserRepository;
            _mapper = mapper;
        }

        public async Task<DwUserDto> GetByUsernameAndOrgAsync(string username, string org)
        {
            var dwUser = await _dwUserRepository.GetByUsernameAndOrgAsync(username, org).ConfigureAwait(false);
            var dwUserDto = _mapper.Map<DwUserDto>(dwUser);

            return dwUserDto;
        }
}

Voici un lien similaire sur le même sujet: Comment configurer Automapper dans ASP.NET Core

4
Yasen Raykov

Les documents officiels: https://automapper.readthedocs.io/en/latest/Dependency-injection.html#asp-net-core

Vous définissez la configuration à l'aide de profils. Ensuite, vous indiquez à AutoMapper dans quels assemblys ces profils sont définis en appelant la méthode d'extension IServiceCollection AddAutoMapper au démarrage:

services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/);

ou types de marqueurs:

services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/);
1
Askar Rayapov

J'ai résolu ce problème en créant une classe qui hérite de AutoMapper.Profile

    public class model_to_resource_profile : Profile
    {
        public model_to_resource_profile()
        {
            CreateMap<your_model_class, your_model_resource_class>();
        }
    }

Et en ajoutant cette ligne dans le Startup.cs:

services.AddAutoMapper(typeof(model_to_resource_profile ));
0
CodeRed