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?
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.Abstractions
1.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
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));
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);
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
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) /*, ...*/);
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 ));