web-dev-qa-db-ja.com

AutoMapperをAsp.net Core 2に追加しようとしていますか?

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にはいくつかのパラメーターがあります。このパラメーターに何を送信する必要がありますか?

27
topcool

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.Abstractions1.1.0に依存しており、Microsoft.Extensions.DependencyInjection.Abstractions 1.1.0と2.0の間で重大な変更があったため、ASP.NET Coreでは使用できません。

14
Tseng

AspNet Core 2.2およびAutoMapper.Extensions.Microsoft.DependencyInjection v6.1を使用している場合は、スタートアップファイルで使用する必要があります

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

AutoMapper.Extensions.Microsoft.DependencyInjection nugetパッケージの新しいバージョン(6.1)では、次のように使用する必要があります。

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

これらのどれも私にとってはうまくいきませんでした。私は.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をセットアップする方法

4
Yasen Raykov

公式ドキュメント: 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) /*, ...*/);
1
Askar Rayapov

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 ));
0
CodeRed