Ich habe vor einiger Zeit an einem asp.net Core 1.1-Projekt gearbeitet und es in projetc AutoMapper verwendet.
in asp.net Core 1.1 füge ich services.AddAutoMapper()
in die Startdatei ein:
Startdatei in asp.net core 1.1:
public void ConfigureServices(IServiceCollection services)
{
//Some Code
services.AddMvc();
services.AddAutoMapper();
}
Und ich benutze AutoMapper in Controller leicht.
Controller:
public async Task<IActionResult> AddEditBook(AddEditBookViewModel model)
{
Book bookmodel = AutoMapper.Mapper.Map<AddEditBookViewModel, Book>(model);
context.books.Add(bookmodel);
context.SaveChanges();
}
Und alles war gut. Aber ich arbeite gerade an einem Asp.net Core 2-Projekt und bekomme den Fehler mit services.AddAutoMapper()
in der sturtap-Datei.
Fehler CS0121 Der Aufruf ist zwischen den folgenden Methoden oder Eigenschaften nicht eindeutig: 'ServiceCollectionExtensions.AddAutoMapper (IServiceCollection, params Assembly [])' und 'ServiceCollectionExtensions.AddAutoMapper (IServiceCollection, params Type [])'.
Was ist der Grund für diesen Fehler? Außerdem hat services.AddAutoMapper
In asp.net core 2 einige Parameter. Was soll ich an diesen Parameter senden?
Sie haben wahrscheinlich Ihre ASP.NET Core-Abhängigkeiten aktualisiert, verwenden jedoch weiterhin veraltetes AutoMapper.Extensions.Microsoft.DependencyInjection
Paket.
Für ASP.NET Core benötigen Sie mindestens Version 3.0.1
from https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/3.0.1
Welche Referenzen AutoMapper 6.1.1 oder höher.
AutoMapper (> = 6.1.1)
Microsoft.Extensions.DependencyInjection.Abstractions (> = 2.0.0)
Microsoft.Extensions.DependencyModel (> = 2.0.0)
Die älteren Pakete sind abhängig von Microsoft.Extensions.DependencyInjection.Abstractions
1.1.0
und kann nicht mit ASP.NET Core verwendet werden, da zwischen Microsoft.Extensions.DependencyInjection.Abstractions
1.1.0 und 2.0
Wenn Sie AspNet Core 2.2 und AutoMapper.Extensions.Microsoft.DependencyInjection v6.1 verwenden, müssen Sie in der Startdatei verwenden
services.AddAutoMapper(typeof(Startup));
In der neuen Version (6.1) von AutoMapper.Extensions.Microsoft.DependencyInjection
Nuget-Paket sollten Sie wie folgt verwenden:
services.AddAutoMapper(Type assemblyTypeToSearch);
// OR
services.AddAutoMapper(params Type[] assemblyTypesToSearch);
Keines davon hat bei mir funktioniert, ich habe ein .NET Core 2.2-Projekt und der vollständige Code zum Konfigurieren des Mapper sieht so aus ( Teil der ConfigureService () -Methode ):
// Auto Mapper Configurations
var mappingConfig = new MapperConfiguration(mc =>
{
mc.AddProfile(new SimpleMappings());
});
IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);
Dann habe ich meine Mappings-Klasse, die ich im BL-Projekt platziert habe:
public class SimpleMappings : Profile
{
public SimpleMappings()
{
CreateMap<DwUser, DwUserDto>();
CreateMap<DwOrganization, DwOrganizationDto>();
}
}
Und schließlich sieht die Verwendung des Mapper so aus:
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;
}
}
Hier ist ein ähnlicher Link zum selben Thema: So richten Sie Automapper in ASP.NET Core ein
Die offiziellen Dokumente: https://automapper.readthedocs.io/en/latest/Dependency-injection.html#asp-net-core
Die Konfiguration legen Sie über Profile fest. Anschließend teilen Sie AutoMapper mit, in welchen Assemblys diese Profile definiert sind, indem Sie beim Start die IServiceCollection-Erweiterungsmethode AddAutoMapper aufrufen:
services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/);
oder Markertypen:
services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/);
Ich habe das gelöst, indem ich eine Klasse erstellt habe, die AutoMapper.Profile
public class model_to_resource_profile : Profile
{
public model_to_resource_profile()
{
CreateMap<your_model_class, your_model_resource_class>();
}
}
Und füge diese Zeile in das Startup.cs
:
services.AddAutoMapper(typeof(model_to_resource_profile ));