.Net Core中更高階的AutoMapper示例

cxu0262發表於2020-05-18

AutoMapper是基於約定的,物件導向的對映器。 物件導向的對映器是將輸入物件轉換為不同型別的輸出物件的對映器。 AutoMapper也可以用於對映相似或不相似的物件(即,具有相同或不同的屬性的物件)。

上一篇文章中,我們檢查了AutoMapper的基本功能。 在本文中,我們將探討AutoMapper的一些高階功能。

[ 點選此處註冊免費的三個小時的Kubernetes入門課程,該課程由Pluralsight和InfoWorld提供。 ]

在Visual Studio中建立一個ASP.Net Core專案

首先,讓我們在Visual Studio中建立一個新的ASP.Net Core專案。 請注意,您可以建立任何專案(例如,MVC或什至是控制檯應用程式)來使用AutoMapper。 如果您的系統中安裝了Visual Studio 2019,請按照下面概述的步驟建立一個新的ASP.Net Core專案。

  1. 啟動Visual Studio IDE。
  2. 點選“建立新專案”。
  3. 在“建立新專案”視窗中,從顯示的模板列表中選擇“ ASP.Net Core Web應用程式”。
  4. 點選下一步。
  5. 在接下來顯示的“配置新專案”視窗中,指定新專案的名稱和位置。
  6. 單擊建立。
  7. 在接下來顯示的“建立新的ASP.Net Core Web應用程式”視窗中,從頂部的下拉選單中選擇.Net Core作為執行時,並選擇ASP.Net Core 2.2(或更高版本)。
  8. 選擇“ Web應用程式”作為專案模板,以建立一個新的ASP.Net Core Web應用程式。
  9. 確保未選中“啟用Docker支援”和“配置HTTPS”核取方塊,因為我們此處將不再使用這些功能。
  10. 確保將身份驗證設定為“無身份驗證”,因為我們也不會使用身份驗證。
  11. 單擊建立。

現在,您應該已經準備好在Visual Studio中執行一個新的ASP.Net Core專案。 我們將在本文的後續部分中使用該專案,以說明一些使用AutoMapper的高階操作。

安裝AutoMapper

要開始使用AutoMapper,應在專案中安裝必要的軟體包。 為此,您可以在NuGet軟體包管理器控制檯視窗中使用以下命令:

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

假設安裝成功,您都可以在專案中使用AutoMapper。

配置自動對映器

成功安裝AutoMapper之後,可以通過在IServiceCollection例項上呼叫AddAutoMapper方法來對其進行配置。

public void ConfigureServices(IServiceCollection services)
        {         
            services.AddMvc().SetCompatibilityVersion
            (CompatibilityVersion.Version_2_2);
            services.AddAutoMapper();
        }

使用配置檔案在AutoMapper中指定對映資訊

您可以使用配置檔案來組織對映集合。 若要建立配置檔案,您需要建立一個擴充套件AutoMapper庫的Profile類的類。 然後,您可以將必要的對映配置資訊新增到剛建立的類的建構函式中。 CreateMap方法用於建立兩種型別之間的對映。

下列類顯示如何通過擴充套件Profile類並指定對映資訊來建立名為AuthorProfile的類。

public class AuthorProfile : Profile
{
     public AuthorProfile()
     {
         CreateMap<AuthorModel, AuthorDTO>();
     }
}

在AutoMapper中使用ReverseMap()方法

請注意,上面的示例是單向對映。 同樣,假設您已使用CreateMap方法定義了單向對映,如下面的程式碼片段所示。

AutoMapper.Mapper.CreateMap<Author, AuthorModel>();

現在,您可以將Author類的例項對映到AuthorModel,如下所示。

var authorModel = AutoMapper.Mapper.Map<AuthorModel>(author);

現在,假設您想將AuthorModel例項對映回Author例項。 您可以嘗試使用以下程式碼。

var author = AutoMapper.Mapper.Map<Author>(authorModel);

但是,請注意,這將引發執行時異常。 發生異常是因為AutoMapper執行時缺少執行此對映所需的知識。 實現此反向對映的一種方法是從頭開始重新建立對映。 一種更簡單更好的方法是通過使用CreateMap方法之外的ReverseMap方法,如下面的程式碼片段所示。

AutoMapper.Mapper.CreateMap<Author, AuthorModel>().ReverseMap();

在AutoMapper中使用ForMember()和MapFrom()方法

下一個示例將使用上一篇有關AutoMapper的文章中的AuthorModel和AuthorDTO類。 您可以在此處參考該文章

以下程式碼段說明了如何對映AuthorModel和AuthorDTO類的物件。

var author = new AuthorModel();           
author.Id = 1;
author.FirstName = "Joydip";
author.LastName = "Kanjilal";
author.Address = "Hyderabad";
var authorDTO = _mapper.Map<AuthorDTO>(author);

現在,假設在AuthorModel類中名為Address的屬性已更改為Address1。

public class AuthorModel
   {
       public int Id
       {
           get; set;
       }
       public string FirstName
       {
           get; set;
       }
       public string LastName
       {
           get; set;
       }
       public string Address1
       {
           get; set;
       }
   }

然後,您可以在AuthorProfile類中更新對映資訊,如下所示。

public class AuthorProfile : Profile
    {
        public AuthorProfile()
        {
            CreateMap<AuthorModel, AuthorDTO>().ForMember
             (destination => destination.Address,
             map => map.MapFrom(source => source.Address1));          
        }
    }

在AutoMapper中使用NullSubstitute

假設AuthorModel中的Address欄位為null,並且您希望使用“ No data”之類的東西來代替null值。 這是NullSubstitution起作用的地方。 以下程式碼段說明了如何使用“無資料”替換空值。

AutoMapper.Mapper.CreateMap<AuthorModel, AuthorDTO>()
  .ForMember(destination => destination.Address, opt => opt.NullSubstitute("No data"));

在AutoMapper中對映之前和之後使用

考慮以下兩個類。

public class OrderModel
  {
    public int Id { get; set; }
    public string ItemCode { get; set; }
    public int NumberOfItems { get; set; }
  }
public class OrderDTO
  {
    public int Id { get; set; }
    public string ItemCode { get; set; }
    public int NumberOfItems { get; set; }
  }

您可以利用BeforeMap()方法執行一些計算或初始化源或目標例項中的資料成員。 以下程式碼段說明了如何實現此目的。

Mapper.Initialize(cfg => {
  cfg.CreateMap()
    .BeforeMap((src, dest) => src.NumberOfItems = 0)
});

完成對映後,可以使用AfterMap()方法對目標物件執行操作。 這是在目標例項上使用AfterMap()方法的方法。

 public OrderDTO MapAuthor(IMapper mapper, OrderDTO orderDTO)
        {
            return mapper.Map<OrderModel, OrderDTO>(orderDTO, opt =>
            {
                opt.AfterMap((src, dest) =>
                {
                    dest.NumberOfItems =
                    _orderService.GetTotalItems(src);
               });
            });
        }

在AutoMapper中使用巢狀對映

AutoMapper也可以用於對映巢狀物件。 請考慮以下域類。

public class Order
    {
        public string OrderNumber { get; set; }
        public IEnumerable<OrderItem> OrderItems { get; set; }
    }
public class OrderItem
    {
        public string ItemName { get; set; }
        public decimal ItemPrice { get; set; }
        public int ItemQuantity { get; set; }
    }

考慮以下代表資料傳輸物件的類。

public class OrderDto
    {
        public string OrderNumber { get; set; }
        public IEnumerable<OrderItemDto> OrderItems { get; set; }
    }
public class OrderItemDto
    {
        public string ItemName { get; set; }
        public decimal ItemPrice { get; set; }
        public int ItemQuantity { get; set; }
    }

您可以使用以下程式碼建立對映。

var orders = _repository.GetOrders();
Mapper.CreateMap<Order, OrderDto>();
Mapper.CreateMap<OrderItem, OrderItemDto>();
var model = Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(orders);

AutoMapper使您能夠以最少的配置對映物件。 您甚至可以使用自定義解析器來對映具有不同資料結構的物件。 自定義解析器可以生成與目標物件具有相同結構的交換物件,以便AutoMapper執行時可以在執行時對映型別。

From: https://www.infoworld.com/article/3406800/more-advanced-automapper-examples-in-net-core.html

相關文章