本篇文章給大家分享的是有關(guān)AutoMapper及靜態(tài)類的示例分析,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比松陽(yáng)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式松陽(yáng)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋松陽(yáng)地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
在進(jìn)行API設(shè)計(jì)時(shí),靜態(tài)類的使用有時(shí)會(huì)為設(shè)計(jì)者帶來(lái)一些煩惱。應(yīng)該將某個(gè)函數(shù)暴露為靜態(tài)函數(shù)還是實(shí)例方法,這一點(diǎn)常常會(huì)造成人們的爭(zhēng)論。
靜態(tài)函數(shù)的主要優(yōu)點(diǎn)在于其簡(jiǎn)便性。調(diào)用者可以在代碼中的任意位置使用靜態(tài)函數(shù),而無(wú)需為實(shí)例的創(chuàng)建、管理以及依賴注入等問(wèn)題而煩惱。并且由于沒有創(chuàng)建新的實(shí)例,因而也不存在垃圾回收的問(wèn)題,從而使性能也得以提高。
如果沒有維護(hù)狀態(tài)的需求,以上的論點(diǎn)確實(shí)是成立的。如若不然,則設(shè)計(jì)者必須保證靜態(tài)函數(shù)的線程安全,而這往往牽涉到開銷較大的加鎖與同步等技術(shù)。而且即便獨(dú)立的調(diào)用是線程安全的,但調(diào)用者也往往需要將一系列調(diào)用過(guò)程封裝為一個(gè)原子性的事務(wù)。AutoMapper目前也遇到了這方面的麻煩。
AutoMapper最初是圍繞著靜態(tài)函數(shù)而設(shè)計(jì)的,但隨著時(shí)間的推移,它的可配置性也在逐步提高。每當(dāng)出現(xiàn)新的配置選項(xiàng),就需要管理更多的狀態(tài),而潛在的線程問(wèn)題也在逐漸加劇。因此,2020年1月,Jimmy Bogard將AutoMapper 4.2版本中的靜態(tài)函數(shù)一律標(biāo)記為過(guò)時(shí)(obselete)方法,并打算最終完全移除這些函數(shù)。
在我開發(fā)AutoMapper 4.2版本的過(guò)程中,腦海中突然有靈光一閃。過(guò)去這十年間,我多次在講座與播客中談到了如何長(zhǎng)期維護(hù)開源代碼的問(wèn)題。對(duì)于AutoMapper,我最大的遺憾就是在一開始設(shè)計(jì)了一套靜態(tài)的API。AutoMapper最初的測(cè)試與原型中都是通過(guò)“Mapper.CreateMap”與“Mapper.Map”等方法調(diào)用的。當(dāng)時(shí)我向我的老板Jeffrey Palermo展示了我的代碼,并詢問(wèn)他對(duì)代碼的看法。他當(dāng)時(shí)說(shuō)道:“這看上去很棒Jimmy,不過(guò)API似乎不應(yīng)該設(shè)計(jì)成靜態(tài)的”,而我則回應(yīng)說(shuō):“開玩笑吧,這不可能!”。
之后,我開始意識(shí)到靜態(tài)函數(shù)的問(wèn)題,至今都為此感到懊悔。在即將發(fā)布的新版本中,我利用這次機(jī)會(huì)設(shè)計(jì)了一個(gè)不再使用靜態(tài)方法的原型,它表現(xiàn)得很出色,我也準(zhǔn)備好將整個(gè)靜態(tài)API標(biāo)記為過(guò)時(shí)方法。
這一改動(dòng)也確實(shí)造成了某些問(wèn)題。AutoMapper的特性之一是支持fluent API,它能夠配合LINQ表達(dá)式鏈工作。這一特性需要用到擴(kuò)展方法,而擴(kuò)展方法往往都是通過(guò)靜態(tài)函數(shù)的方式定義的。
我選擇的臨時(shí)方案是仍然提供對(duì)LINQ的支持,但改變了它的方式,使其不再利用全局的狀態(tài)。使用者需要將AutoMapper配置信息傳遞給LINQ表達(dá)式,這種方式稍嫌冗長(zhǎng),但從某些方面來(lái)看,它提供了更大的靈活性。
以下示例是從“靜態(tài)API遷移指南”中所摘錄的一段代碼:
public class ProductsController : Controller { public ProductsController(MapperConfiguration config) { this.config = config; } private MapperConfiguration config; public ActionResult Index(int id) { var dto = dbContext.Products .Where(p => p.Id == id) .ProjectTo(config) .SingleOrDefault(); return View(dto); } }
可就在一個(gè)月后,Jimmy Bogard又決定讓這些靜態(tài)函數(shù)重新回歸。他寫道:
靜態(tài)API的一大困擾在于使用者可以隨時(shí)對(duì)配置進(jìn)行改動(dòng),而我卻無(wú)法強(qiáng)制要求使用者對(duì)配置的步驟進(jìn)行清理。但在進(jìn)一步思考之后,我發(fā)現(xiàn)靜態(tài)API的使用并沒有任何問(wèn)題,它只是要求使用者在進(jìn)行映射之前必須完成初始化工作。因此我決定在后續(xù)版本中仍然允許這種使用方式。實(shí)例API如今已經(jīng)徹底完善了,而靜態(tài)API實(shí)際上只是一種輕量級(jí)的封裝,使用者可以簡(jiǎn)單地調(diào)用靜態(tài)Initialize方法,而無(wú)需直接調(diào)用實(shí)例的構(gòu)造函數(shù)。新發(fā)布的版本移除了某些過(guò)時(shí)屬性,并且恢復(fù)了在LINQ映射時(shí)使用靜態(tài)配置的特性。
以上就是AutoMapper及靜態(tài)類的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享題目:AutoMapper及靜態(tài)類的示例分析
分享路徑:http://chinadenli.net/article24/ppgdje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、網(wǎng)站排名、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站制作、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)