在實際的軟體開發專案中,我們的「業務邏輯」常常需要我們對同樣的資料進行各種變換。例如,一個Web應用程式透過前端收集使用者的輸入成為Dto,然後將Dto轉換成領域模型並持久化到資料庫中。另一方面,當使用者要求資料時,我們又需要做相反的工作:將從資料庫中查詢出來的領域模型以相反的方式轉換成Dto再呈現給使用者。有時候我們也會面臨更多的資料使用需求,例如有多個資料使用的客戶端,每個客戶端都有自己對資料結構的不同需求,而這也需要我們進行更多的資料轉換。
頻繁的資料轉換瑣碎而又凌亂,很多時候我們不得不:
(1)在兩個類型幾乎只是名字不同而結構大體相似,卻只能以手工的、逐個屬性賦值的方式實現數據在類型間的“傳遞”。
(2)每遇到一個新的資料轉換場景就手動實現一套轉換邏輯,導致資料轉換操作重複而又分散到應用的各個角落。
如果有這樣一個“變形金剛”般的工具,把“橘子”變成我們想要的“蘋果”,而我們需要做的只是定義好轉換規則——做我們真正的業務邏輯,或者甚至在簡單場景下連規則都不需要定義(Convention Over Configuration),那將會是一件非常美好的事情。事實上在.NET中我們不用重複發明輪子,因為我們有-AutoMapper,一個強大的Object-Object Mapping工具。
好吧,我承認自己有一點小小的激動,事實上我所做的項目正在經歷以上的“困惑”,而AutoMapper確實帶給我眼前一亮的感覺。因此我花了一點週末休息時間小小嘗試了一把AutoMapper,透過做小的應用場景實現Dto到領域模型的映射,確實感覺到了它的「強大氣場」。我將在文章中分享自己的使用心得,希望能為同樣處於困惑中的你帶來一點幫助。完整的專案程式碼我會在晚一些時候發佈到自己的git repository中,歡迎大家自由參考使用。
【一】 應用場景說明
先來看看我所」虛擬「的領域模型。這次我定義了一個書店(BookStore):
C#代碼
public class BookStore
{
public List
public Address Address { get; set; }
}
書店有自己的地址(Address):{
public string Country { get; set; }
public string City { get; set; }
public string Street { get }
}
同時書店裡放了n本書(Book):C#代碼
public class Book
{
public string Ti { get; set; }
public string Language { get; set; }
Price { get; set; }
public List
public Publisher Publisher { get; set; }
public int? Paperback { get; set; }
}
每本書都有出版商資訊(Publisher):C#
public string Name { get; set; } }每本書可以有最多2個作者的資料(Author):
C#代碼
public class Author
; }
public string Description { get; set; }
public ContactInfo Cont ):
C#代碼
public class ContactInfo
差不多就是這樣了,一個有著層級結構的領域模型。
再來看看我們的Dto結構。在Dto中我們有與BookStore對應的BookStoreDto:
C#代碼
public class BookStoreDto
public List
public AddressDto Address { get; set; }
}
{ public string Country { get; set; }public string City { get; set; } public string Street { get }
}
以及與Book相對應的BookDto:
C#代碼 public class BookDto { public string Title { get) set; } public string Language { get; set; } public decimal Price { get; set; } public DateTime? PublishDate { get; set; }
int? Paperback { get; set; }
public string FirstAuthorDescription { get; set; } public string FirstAuthorEmail AuthorBlog { get; set; } public string FirstAuthorTwitter { get; set; } ; set; } public string SecondAuthorDescription { get; set; } public string SecondAuthorBlog { get; set; } public string SecondAuthorTwitter { get }
注意到我們的BookDto」拉平了「整個Book的層級結構,一個BookDto裡攜帶了Book及其所有Author、Publisher等所有模式的資料。
剛好我們來看Dto到Model的映射規則。(1)BookStoreDto -> BookStore
BookStoreDto中的欄位 BookStore的欄位 Name Name(2)AddressDto -> Address
AddressDto中的欄位 Address中的場域 Country Country City City Street Street Street StreetPostCode PostCode
(3)BookDto -> Book。
BookDto中的一些基本欄位可以直接對應到Book中的欄位。
BookDto中的字段 Book中的字段
Title Title
Description Description
Description Description
Description Description
Description Price
PublishDate PublishDate
Paperback Paperback
Book
Paperback Paperback
BookDto中的欄位 Book中的Authors中的第1個Author物件中的欄位
FirstAuthorName Name
🜒 ContactInfo.Email FirstAuthorBlog ContactInfo.Blog FirstAuthorTwitter 注意上表中的ContactInfo.Email表示對應到Author物件的ContactInfo的Email字段,依序類推。類似的我們有:BookDto中的欄位 Book中的Authors中的第2個Author物件中的欄位
SecondAuthorName Name uthorEmail ContactInfo.Email
SecondAuthorBlog ContactInfo.Blog
SecondAuthorTwitter ContactInfo .Twitter
最後還有Publisher字段,它將對應到一個獨立的Publisher物件。BookDto中的欄位 Publisher中的欄位
Publisher Name
之間的大坨就是如此簡單的需求

C#.NET生態系統提供了豐富的框架和庫,幫助開發者高效構建應用。 1.ASP.NETCore用於構建高性能Web應用,2.EntityFrameworkCore用於數據庫操作。通過理解這些工具的使用和最佳實踐,開發者可以提高應用的質量和性能。

如何將C#.NET應用部署到Azure或AWS?答案是使用AzureAppService和AWSElasticBeanstalk。 1.在Azure上,使用AzureAppService和AzurePipelines自動化部署。 2.在AWS上,使用AmazonElasticBeanstalk和AWSLambda實現部署和無服務器計算。

C#和.NET的結合為開發者提供了強大的編程環境。 1)C#支持多態性和異步編程,2).NET提供跨平台能力和並發處理機制,這使得它們在桌面、Web和移動應用開發中廣泛應用。

.NETFramework是一個軟件框架,C#是一種編程語言。 1..NETFramework提供庫和服務,支持桌面、Web和移動應用開發。 2.C#設計用於.NETFramework,支持現代編程功能。 3..NETFramework通過CLR管理代碼執行,C#代碼編譯成IL後由CLR運行。 4.使用.NETFramework可快速開發應用,C#提供如LINQ的高級功能。 5.常見錯誤包括類型轉換和異步編程死鎖,調試需用VisualStudio工具。

C#是一種由微軟開發的現代、面向對象的編程語言,.NET是微軟提供的開發框架。 C#結合了C 的性能和Java的簡潔性,適用於構建各種應用程序。 .NET框架支持多種語言,提供垃圾回收機制,簡化內存管理。

C#和.NET運行時緊密合作,賦予開發者高效、強大且跨平台的開發能力。 1)C#是一種類型安全且面向對象的編程語言,旨在與.NET框架無縫集成。 2).NET運行時管理C#代碼的執行,提供垃圾回收、類型安全等服務,確保高效和跨平台運行。

要開始C#.NET開發,你需要:1.了解C#的基礎知識和.NET框架的核心概念;2.掌握變量、數據類型、控制結構、函數和類的基本概念;3.學習C#的高級特性,如LINQ和異步編程;4.熟悉常見錯誤的調試技巧和性能優化方法。通過這些步驟,你可以逐步深入C#.NET的世界,並編寫高效的應用程序。

C#和.NET的關係是密不可分的,但它們不是一回事。 C#是一門編程語言,而.NET是一個開發平台。 C#用於編寫代碼,編譯成.NET的中間語言(IL),由.NET運行時(CLR)執行。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3漢化版
中文版,非常好用

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。