c# - .net core automapper




如何在ASP.NET Core中設置Automapper (8)

services.AddAutoMapper(); 沒有為我工作。 (我正在使用Asp.Net Core 2.0)

如下配置後

   var config = new AutoMapper.MapperConfiguration(cfg =>
   {                 
       cfg.CreateMap<ClientCustomer, Models.Customer>();
   });

初始化映射器IMapper mapper = config.CreateMapper();

並將映射器對像作為單例服務添加到服務。AddSingleton(mapper);

這樣我就可以向控制器添加DI

  private IMapper autoMapper = null;

  public VerifyController(IMapper mapper)
  {              
   autoMapper = mapper;  
  }

我在動作方法中使用了以下內容

  ClientCustomer customerObj = autoMapper.Map<ClientCustomer>(customer);

我是.NET的新手,所以我決定使用.NET Core,而不是學習“舊方法”。 我在這裡找到了有關 為.NET Core設置AutoMapper 的詳細文章,但是對於新手來說,是否有更簡單的演練?


theutz'在這裡的答案非常好,我只想添加以下內容:

如果讓映射配置文件繼承自 MapperConfigurationExpression 而不是 Profile ,則可以非常簡單地添加一個測試來驗證映射設置,這總是很方便的:

public static IServiceCollection AddAutoMapper(this IServiceCollection services)
{
     return services.AddAutoMapper(null, AppDomain.CurrentDomain.GetAssemblies());
}

將AutoMapper與ASP.NET Core結合使用的步驟。

步驟1.從NuGet包中安裝AutoMapper.Extensions.Microsoft.DependencyInjection。

步驟2.在解決方案中創建一個文件夾,以保留名稱為“ Mappings”的映射。

第3步。添加Mapping文件夾後,我們添加了一個名稱為“ MappingProfile ”的類,該名稱可以唯一且易於理解。

在本課程中,我們將維護所有映射。

步驟4.在啟動“ ConfigureServices”中初始化Mapper

在啟動類中,我們需要初始化已創建的配置文件,並註冊AutoMapper服務。

  Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>());

  services.AddAutoMapper();

代碼段顯示了ConfigureServices方法,我們需要在其中初始化和註冊AutoMapper。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }


    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });


        // Start Registering and Initializing AutoMapper

        Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>());
        services.AddAutoMapper();

        // End Registering and Initializing AutoMapper

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    }}

步驟5.獲取輸出。

要獲得映射結果,我們需要調用AutoMapper.Mapper.Map並傳遞適當的目標和源。

AutoMapper.Mapper.Map<Destination>(source);

CodeSnippet

    [HttpPost]
    public void Post([FromBody] SchemeMasterViewModel schemeMaster)
    {
        if (ModelState.IsValid)
        {
            var mappedresult = AutoMapper.Mapper.Map<SchemeMaster>(schemeMaster);
        }
    }

對於ASP.NET Core,如果您喜歡閱讀源文檔,則: https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/blob/master/README.md : https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/blob/master/README.md

否則,請按照以下4個步驟操作:

  1. 從nuget安裝AutoMapper.Extensions.Microsoft.DependancyInjection。

  2. 只需添加一些配置文件類。

  3. 然後將以下內容添加到您的startup.cs類中。 services.AddAutoMapper(OneOfYourProfileClassNamesHere)

  4. 然後只需將IMapper注入控制器或您需要的任何位置:

//add automapper DI
services.AddAutoMapper(typeof(MappingProfile));

如果您現在想簡單地使用ProjectTo:

    [Route("api/[controller]")]
    [ApiController]
    public class AnyController : ControllerBase
    {
        private readonly IMapper _mapper;

        public AnyController(IMapper mapper)
        {
            _mapper = mapper;
        }

        public IActionResult Get(int id)
        {
            var entity = repository.Get(id);
            var dto = _mapper.Map<Dest>(entity);

            return Ok(dto);
        }
    }


我想擴展@theutz的答案-即這一行:

[Fact]
public void MappingProfile_VerifyMappings()
{
    var mappingProfile = new MappingProfile();

    var config = new MapperConfiguration(mappingProfile);
    var mapper = new Mapper(config);

    (mapper as IMapper).ConfigurationProvider.AssertConfigurationIsValid();
}

AutoMapper.Extensions.Microsoft.DependencyInjection版本3.2.0中有一個錯誤( 可能是 )。 (我正在使用.NET Core 2.0)

此問題在GitHub問題中解決。 如果您的繼承AutoMapper的Profile類的類存在於您的Startup類所在的程序集之外,則在您的AutoMapper注入看起來像這樣的情況下,它們可能不會被註冊:

// services.AddAutoMapper(typeof(Startup));  // <-- newer automapper version uses this signature.

除非您明確指定要搜索AutoMapper配置文件的程序集。

可以在Startup.ConfigureServices中這樣完成:

services.AddAutoMapper();

其中 “程序集” “ type_in_assemblies” 指向在您的應用程序中指定了Profile類的程序集。 例如:

services.AddAutoMapper(<assembies> or <type_in_assemblies>);

(並強調這個詞)是由於以下無參數重載的實現(來自 GitHub 源代碼):

services.AddAutoMapper(typeof(ProfileInOtherAssembly), typeof(ProfileInYetAnotherAssembly));

我們依靠CLR已經包含JIT程序集的AutoMapper概要文件進行了JIT組裝,因為它們僅在需要時才被偽裝( this 問題中的更多詳細信息), this 可能為真,也可能不為真。


我正在使用AutoMapper 6.1.1和asp.net Core 1.1.2。

首先,定義由Automapper的Profile Class繼承的Profile類。 我創建了一個IProfile接口,它是空的,目的只是為了找到這種類型的類。

public class EmployeesController {

    private readonly IMapper _mapper;

    public EmployeesController(IMapper mapper){

        _mapper = mapper;
    }

現在創建一個單獨的類,例如Mappings

var customers = await dbContext.Customers.ProjectTo<CustomerDto>(_mapper.ConfigurationProvider).ToListAsync()

現在,在MVC Core Web Project中的Startup.cs文件中,在構造函數中,調用Mapping類,該類將在加載應用程序時初始化所有映射。

    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<Source, Dest>().ReverseMap();
        }
    }

添加到提到的Arve Systad進行測試。 如果出於某種原因,您喜歡我,並且想要維護theutz解決方案中提供的繼承結構,則可以按照以下方式設置MapperConfiguration:

var mappingProfile = new MappingProfile();
var config = new MapperConfiguration(cfg =>
{
    cfg.AddProfile(mappingProfile);
});
var mapper = new Mapper(config);

我在NUnit中做到了。


關於theutz答案,無需在控制器構造函數中指定 IMapper映射器 參數。

您可以使用Mapper,因為它在代碼的任何位置都是靜態成員。

public class UserController : Controller {
   public someMethod()
   {
      Mapper.Map<User, UserDto>(user);
   }
}






automapper