尝试将AutoMapper添加到Asp.net Core 2?

top*_*ool 41 asp.net-mvc automapper asp.net-core asp.net-core-2.0

我前一段时间从事asp.net core 1.1项目,并在projetc AutoMapper中使用。

在asp.net core 1.1中,我添加services.AddAutoMapper()了启动文件:

asp.net core 1.1中的启动文件:

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

        services.AddMvc();
        services.AddAutoMapper();
    }
Run Code Online (Sandbox Code Playgroud)

而且我可以轻松地在Controller中使用AutoMapper。

控制器:

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

一切都很好。但是我目前正在研究Asp.net Core 2项目,并且services.AddAutoMapper()在sturtap文件中遇到错误。

错误CS0121,以下方法或属性之间的调用不明确:'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection,params Assembly [])'和'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection,params Type [])'

此错误的原因是什么?另外,services.AddAutoMapper在asp.net中,核心2具有一些参数。我应该向该参数发送什么?

dev*_*ria 125

如果您使用的是AspNet Core 2.2和AutoMapper.Extensions.Microsoft.DependencyInjection v6.1,则需要在启动文件中使用

services.AddAutoMapper(typeof(Startup));
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,下一个遇到的问题:我必须安装Microsoft.Extensions.DependencyInjection.Abstractions来制作services.AddAutoMapper(typeof(Startup)); 工作 (9认同)
  • 在.net core 2.2上,这为我消除了构建错误,但由于缺少映射配置而在运行时仍然失败..对我有用的是在语句内列出我的所有概要文件类。即:services.AddAutoMapper(typeof(profileClassName1),typeof(profileClassName2)); (2认同)
  • @nirweiner 的评论是正确的,但您只需指向配置文件类之一,因为它要求在其中搜索程序集。如果您的配置文件配置位于同一程序集中,则 dev-siberia 的答案有效。 (2认同)

Tse*_*eng 21

您可能更新了ASP.NET Core依赖项,但仍使用过时的AutoMapper.Extensions.Microsoft.DependencyInjection包。

对于ASP.NET核心,你需要至少版本3.0.1https://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.0ASP.NET Core ,并且不能与ASP.NET Core一起使用,因为在Microsoft.Extensions.DependencyInjection.Abstractions1.1.0和2.0 之间发生了重大更改。

  • 谢谢。我更新了`AutoMapper.Extensions.Microsoft.DependencyInjection`并解决了错误。 (3认同)

Ami*_*lle 9

如果您使用的是 AspNet Core 2.2.请尝试更改您的代码

从:

services.AddAutoMapper();
Run Code Online (Sandbox Code Playgroud)

到:

services.AddAutoMapper(typeof(Startup));
Run Code Online (Sandbox Code Playgroud)

它对我有用。


R M*_*hed 9

安装包:

Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection -Version 7.0.0
Run Code Online (Sandbox Code Playgroud)

Nuget: https ://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/

在创业班:

services.AddAutoMapper(typeof(Startup));
Run Code Online (Sandbox Code Playgroud)


Moh*_*yan 8

在新版本(6.1)的AutoMapper.Extensions.Microsoft.DependencyInjectionnuget软件包中,您应按以下方式使用它:

services.AddAutoMapper(Type assemblyTypeToSearch);
// OR
services.AddAutoMapper(params Type[] assemblyTypesToSearch);
Run Code Online (Sandbox Code Playgroud)


Yas*_*kov 6

这些都不适合我,我有一个.NET Core 2.2项目,用于配置映射器的完整代码如下所示(ConfigureService()方法的一部分):

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

    IMapper mapper = mappingConfig.CreateMapper();
    services.AddSingleton(mapper);
Run Code Online (Sandbox Code Playgroud)

然后,将我的Mappings类放入BL项目中:

public class SimpleMappings : Profile
    {
        public SimpleMappings()
        {
            CreateMap<DwUser, DwUserDto>();
            CreateMap<DwOrganization, DwOrganizationDto>();
        }
    }
Run Code Online (Sandbox Code Playgroud)

最后,映射器的用法如下所示:

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;
        }
}
Run Code Online (Sandbox Code Playgroud)

这是同一主题的相似链接: 如何在ASP.NET Core中设置Automapper


Sha*_*hah 6

.Net 6中,你可以这样做

builder.Services.AddAutoMapper(typeof(Program).Assembly); // Since there is no Startup file
Run Code Online (Sandbox Code Playgroud)

或者

builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
Run Code Online (Sandbox Code Playgroud)

基本上,它需要程序集名称,如下面的屏幕截图所示 在此输入图像描述