溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

AutoMapper及靜態(tài)類(lèi)的示例分析

發(fā)布時(shí)間:2022-01-05 14:53:40 來(lái)源:億速云 閱讀:158 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)AutoMapper及靜態(tài)類(lèi)的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。

在進(jìn)行API設(shè)計(jì)時(shí),靜態(tài)類(lè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)建、管理以及依賴(lài)注入等問(wèn)題而煩惱。并且由于沒(méi)有創(chuàng)建新的實(shí)例,因而也不存在垃圾回收的問(wèn)題,從而使性能也得以提高。

如果沒(méi)有維護(hù)狀態(tài)的需求,以上的論點(diǎn)確實(shí)是成立的。如若不然,則設(shè)計(jì)者必須保證靜態(tài)函數(shù)的線(xiàn)程安全,而這往往牽涉到開(kāi)銷(xiāo)較大的加鎖與同步等技術(shù)。而且即便獨(dú)立的調(diào)用是線(xiàn)程安全的,但調(diào)用者也往往需要將一系列調(diào)用過(guò)程封裝為一個(gè)原子性的事務(wù)。AutoMapper目前也遇到了這方面的麻煩。

AutoMapper最初是圍繞著靜態(tài)函數(shù)而設(shè)計(jì)的,但隨著時(shí)間的推移,它的可配置性也在逐步提高。每當(dāng)出現(xiàn)新的配置選項(xiàng),就需要管理更多的狀態(tài),而潛在的線(xiàn)程問(wèn)題也在逐漸加劇。因此,2020年1月,Jimmy Bogard將AutoMapper 4.2版本中的靜態(tài)函數(shù)一律標(biāo)記為過(guò)時(shí)(obselete)方法,并打算最終完全移除這些函數(shù)。

在我開(kāi)發(fā)AutoMapper 4.2版本的過(guò)程中,腦海中突然有靈光一閃。過(guò)去這十年間,我多次在講座與播客中談到了如何長(zhǎng)期維護(hù)開(kāi)源代碼的問(wèn)題。對(duì)于A(yíng)utoMapper,我最大的遺憾就是在一開(kāi)始設(shè)計(jì)了一套靜態(tài)的API。AutoMapper最初的測(cè)試與原型中都是通過(guò)“Mapper.CreateMap”與“Mapper.Map”等方法調(diào)用的。當(dāng)時(shí)我向我的老板Jeffrey Palermo展示了我的代碼,并詢(xún)問(wèn)他對(duì)代碼的看法。他當(dāng)時(shí)說(shuō)道:“這看上去很棒Jimmy,不過(guò)API似乎不應(yīng)該設(shè)計(jì)成靜態(tài)的”,而我則回應(yīng)說(shuō):“開(kāi)玩笑吧,這不可能!”。

之后,我開(kāi)始意識(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ù)重新回歸。他寫(xiě)道:

靜態(tài)API的一大困擾在于使用者可以隨時(shí)對(duì)配置進(jìn)行改動(dòng),而我卻無(wú)法強(qiáng)制要求使用者對(duì)配置的步驟進(jìn)行清理。但在進(jìn)一步思考之后,我發(fā)現(xiàn)靜態(tài)API的使用并沒(méi)有任何問(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)類(lèi)的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI