首頁>技術>

AutoMapper 是一個非常流行的 object-to-object 對映庫,它的目的就是幫助你實現不同型別物件之間的對映,舉一個例子,在 DDD 開發模式中,你可能需要實現將 DTO object 對映為 Model object,在過去,你需要人肉的將這兩個型別下的屬性欄位進行一一對映,現在 AutoMapper 就可以幫你節省 這種冗餘的模板式程式碼 匹配所耗費的時間。

開始玩 AutoMapper 之前,你需要在 Visual Studio 中建立一個 Project 並且安裝 AutoMapper,你可以從 NuGet 上下載,也可以在 NuGet Package Manager Console 控制檯輸入如下命令:

PM> Install-Package AutoMapper
使用 AutoMapper 建立對映關係

像 AutoMapper 這樣的 object-to-object 對映工具,它必須能夠做到將一種輸入型別轉換成另一個輸出型別,是不是很拗口,可以先考慮下面的兩個類。

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

接下來,下面的程式碼段將會告知你如何使用 AutoMapper 在 AuthorModel 和 AuthorDTO 這兩個物件之間建立一個 mapping 關係。

var config = new MapperConfiguration(cfg => {                cfg.CreateMap<AuthorModel, AuthorDTO>();            });

最終的 mapping 轉換,你還需要增加幾句下面的程式碼,實現兩個型別之間的轉換。

IMapper iMapper = config.CreateMapper();var source = new AuthorModel();var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);
一個 AutoMapper 的例子

接下來可以上一些資料了,可以參考下面的程式碼片段,我準備先在 source object 上賦值,然後執行 AutoMapper 中的 Map 方法之後,在 destination object 上原樣顯示出來。

var config = new MapperConfiguration(cfg => {                cfg.CreateMap<AuthorModel, AuthorDTO>();            });IMapper iMapper = config.CreateMapper();var source = new AuthorModel();source.Id = 1;source.FirstName = "Joydip";source.LastName = "Kanjilal";source.Address = "India";var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);Console.WriteLine("Author Name: "+ destination.FirstName + " " + destination.LastName);

當你執行完這段程式碼之後,destination object 上的 Author Name 將會輸出到控制檯上,目標物件上的 FirstName 和 LastName 和 source object 上的這兩個屬性值保持一致,說明 automapper 已經幫你成功對映。

值得注意的是,AutoMapper 不僅僅可以 mapping 一個類,還可以 mapping 多個類,預設情況下,AutoMapper會按照預設約定匹配,也就是被mapping的物件之間具有相同的屬性名稱才能被成功對映,但現實情況下,很多被對映的屬性名稱是不相同的,這個時候就需要人工介入指定 mapping 關係讓 AutoMapper 按照你設定的執行,假定你需要實現 Contact 到 ContactDetails 之間的對映,下面的例子展示瞭如何去實現這種關係。

var config = new MapperConfiguration(cfg => {                cfg.CreateMap<AuthorModel, AuthorDTO>()                .ForMember(destination => destination.ContactDetails,               opts => opts.MapFrom(source => source.Contact));            });

下面的語句可以建立最終的 destination object 物件。

var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);

有時候你已經生成了 destination object,在這基礎上你還想二次對映,這時可以使用下面替代語句。

iMapper.Map(sourceObject, destinationObject);

本質上來說,上面的這段程式碼常用於匹配兩個已存在的 object。

使用 AutoMapping 的 projections 功能

AutoMapper 提供了非常好的 projections 功能,projections 的地方在於在 mapping 對映時可以無視兩者的 object 資料結構是否一致,比如說讓 source 的多個屬性 對映到 destination 的一個屬性上,而上面我們一直討論的都是一對一的 object mapping。

接下來我們一起學習下 projection,舉個例子,考慮如下類。

    public class Address    {        public string City { get; set; }        public string State { get; set; }        public string Country { get; set; }    }

接下來在 AuthorModel 類中新增一個 Address 屬性用來儲存 Author 的地址資訊,修改後的 AuthorModel 類如下:

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

然後再更新一下 AuthorDTO 類

    public class AuthorDTO    {        public int Id        {            get; set;        }        public string FirstName        {            get; set;        }        public string LastName        {            get; set;        }        public string City { get; set; }        public string State { get; set; }        public string Country { get; set; }    }

接下來我們需要將 AuthorDTO 對映到 AuthorModel,下面的程式碼片段展示瞭如何去實現。

19
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 如何使用 C# 構建自己的 task scheduler