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

时间:2018-05-18 12:17:58

标签: asp.net-mvc asp.net-core automapper asp.net-core-2.0

我刚刚参与了asp.net核心1.1项目,并在projetc AutoMapper中使用。

在asp.net核心1.1中,我在启动文件中添加services.AddAutoMapper()

asp.net核心1.1中的StartUp文件:

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

        services.AddMvc();
        services.AddAutoMapper();
    }

我很容易在Controller中使用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以下方法或属性之间的调用不明确:&#39; ServiceCollectionExtensions.AddAutoMapper(IServiceCollection,params Assembly [])&#39;和&#39; ServiceCollectionExtensions.AddAutoMapper(IServiceCollection,params Type [])&#39;

出现此错误的原因是什么? 此外,asp.net core 2中的services.AddAutoMapper有一些参数。我该怎么发送这个参数?

10 个答案:

答案 0 :(得分:12)

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

services.AddAutoMapper(typeof(Startup));

答案 1 :(得分:9)

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

对于ASP.NET Core,您至少需要https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/3.0.1

中的版本3.0.1

其中引用了AutoMapper 6.1.1或更高版本。

  

AutoMapper(&gt; = 6.1.1)

     

Microsoft.Extensions.DependencyInjection.Abstractions(&gt; = 2.0.0)

     

Microsoft.Extensions.DependencyModel(&gt; = 2.0.0)

较早的软件包依赖于Microsoft.Extensions.DependencyInjection.Abstractions 1.1.0,并且无法与ASP.NET Core一起使用,因为Microsoft.Extensions.DependencyInjection.Abstractions 1.1.0和2.0之间存在重大变化

答案 2 :(得分:5)

安装软件包:

Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection -Version 7.0.0

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

在启动课程中:

services.AddAutoMapper(typeof(Startup));

答案 3 :(得分:3)

我通过创建一个继承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 ));

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

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

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

    IMapper mapper = mappingConfig.CreateMapper();
    services.AddSingleton(mapper);

然后我将我的Mappings类放置在BL项目中:

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;
        }
}

以下是关于同一主题的类似链接: How to setup Automapper in ASP.NET Core

答案 6 :(得分:1)

官方文档: https://automapper.readthedocs.io/en/latest/Dependency-injection.html#asp-net-core

  

您可以使用配置文件定义配置。然后你让   AutoMapper知道这些配置文件在哪些程序集中定义   在处调用IServiceCollection扩展方法AddAutoMapper   启动:

services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/);
  

或标记类型:

services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/);

答案 7 :(得分:1)

如果您使用的是AspNet Core 2.2,请尝试从以下位置更改代码:

services.AddAutoMapper();

收件人:

services.AddAutoMapper(typeof(Startup));

对我有用!

答案 8 :(得分:0)

尝试一下,可以在2.1及更高版本上使用,我没有使用过任何以前的版本,所以无法分辨。

services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

答案 9 :(得分:0)

2019年12月6日基于Shawn Wildermuth编写的使用ASP.NET Core构建API的多元视野课程的初步尝试。当我收到错误消息“ ...模棱两可的'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection,params Assembly [])...“

我开始研究适当的语法以在Core 2.2中实现AddAutoMapper。我的NuGet参考版本是7.0.0,在本教程中,我在数据存储库目录中创建了Profile类,该类另外引用了我的模型nir weiner和dev-siberia的上述答案使我试图在Startup.ConfigureServices( )的名称:

services.AddAutoMapper(typeof(CampProfile));

概要文件类的内容只是数据类及其构造函数中的模型的(不是双关语意的)旧学校地图

this.CreateMap<Camp, CampModel>();  

这解决了当前版本缺少文档的问题。

恭喜,

ChristianProgrammer