Asp.netコア1.1プロジェクトに少し前に取り組み、projetc AutoMapperで使用しました。
asp.netコア1.1では、スタートアップファイルにservices.AddAutoMapper()
を追加します:
asp.net core 1.1のスタートアップファイル:
public void ConfigureServices(IServiceCollection services)
{
//Some Code
services.AddMvc();
services.AddAutoMapper();
}
そして、コントローラーでAutoMapperを簡単に使用します。
コントローラー:
public async Task<IActionResult> AddEditBook(AddEditBookViewModel model)
{
Book bookmodel = AutoMapper.Mapper.Map<AddEditBookViewModel, Book>(model);
context.books.Add(bookmodel);
context.SaveChanges();
}
そして、すべてが大丈夫だった。しかし、私は現在Asp.net Core 2プロジェクトに取り組んでおり、sturtapファイルのservices.AddAutoMapper()
でエラーが発生します。
エラーCS0121次のメソッドまたはプロパティ間で呼び出しがあいまいです: 'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection、params Assembly [])'および 'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection、params Type [])'
このエラーの理由は何ですか?また、asp.netコア2のservices.AddAutoMapper
にはいくつかのパラメーターがあります。このパラメーターに何を送信する必要がありますか?
ASP.NET Coreの依存関係を更新した可能性がありますが、古いAutoMapper.Extensions.Microsoft.DependencyInjection
パッケージを使用しています。
ASP.NET Coreの場合、少なくともバージョン3.0.1
from https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/3.0.1
AutoMapper 6.1.1以降を参照します。
AutoMapper(> = 6.1.1)
Microsoft.Extensions.DependencyInjection.Abstractions(> = 2.0.0)
Microsoft.Extensions.DependencyModel(> = 2.0.0)
古いパッケージはMicrosoft.Extensions.DependencyInjection.Abstractions
1.1.0
に依存しており、Microsoft.Extensions.DependencyInjection.Abstractions
1.1.0と2.0の間で重大な変更があったため、ASP.NET Coreでは使用できません。
AspNet Core 2.2およびAutoMapper.Extensions.Microsoft.DependencyInjection v6.1を使用している場合は、スタートアップファイルで使用する必要があります
services.AddAutoMapper(typeof(Startup));
AutoMapper.Extensions.Microsoft.DependencyInjection
nugetパッケージの新しいバージョン(6.1)では、次のように使用する必要があります。
services.AddAutoMapper(Type assemblyTypeToSearch);
// OR
services.AddAutoMapper(params Type[] assemblyTypesToSearch);
これらのどれも私にとってはうまくいきませんでした。私は.NET Core 2.2プロジェクトを持っており、マッパーを構成するための完全なコードは次のようになります(ConfigureService()メソッドの一部):
// Auto Mapper Configurations
var mappingConfig = new MapperConfiguration(mc =>
{
mc.AddProfile(new SimpleMappings());
});
IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);
次に、BLプロジェクトに配置したMappingsクラスがあります。
public class SimpleMappings : Profile
{
public SimpleMappings()
{
CreateMap<DwUser, DwUserDto>();
CreateMap<DwOrganization, DwOrganizationDto>();
}
}
最後に、マッパーの使用法は次のようになります。
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;
}
}
同じトピックに関する同様のリンクを次に示します。 ASP.NET CoreでAutomapperをセットアップする方法
公式ドキュメント: https://automapper.readthedocs.io/en/latest/Dependency-injection.html#asp-net-core
プロファイルを使用して構成を定義します。そして、起動時にIServiceCollection拡張メソッドAddAutoMapperを呼び出すことにより、それらのプロファイルがどのアセンブリで定義されているかをAutoMapperに知らせます。
services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/);
またはマーカータイプ:
services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/);
AutoMapper.Profile
を継承するクラスを作成することでこれを解決しました
public class model_to_resource_profile : Profile
{
public model_to_resource_profile()
{
CreateMap<your_model_class, your_model_resource_class>();
}
}
Startup.cs
に次の行を追加します:
services.AddAutoMapper(typeof(model_to_resource_profile ));