第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何更好地構(gòu)建架構(gòu)

如何更好地構(gòu)建架構(gòu)

C#
Cats萌萌 2022-07-10 10:13:05
我有一個(gè) ASP.NET Core 應(yīng)用程序,它從另一個(gè)庫調(diào)用服務(wù)。該服務(wù)使用外部 API,這需要sessionId. 我們必須調(diào)用 Login API 方法來獲取sessionId. 這sessionId能活多久,什么時(shí)候可以改變——我們不知道。規(guī)則是:sessionId1個(gè)請求有效,10個(gè)請求有效,100個(gè)請求有效,1分鐘有效,10分鐘有效,1天有效……沒人知道。該服務(wù)有許多方法可以調(diào)用類似的 API:public class BillRequest{    private readonly HttpClient client;    public BillRequest()    {        client = new HttpClient        {            BaseAddress = new Uri("https://myapi.com/api/v2/")        };    }    public async Task<List<Dto1>> CustomerBankAccountListAsync(int start, int count)    {        List<KeyValuePair<string, string>> nvc = new List<KeyValuePair<string, string>>        {            new KeyValuePair<string, string>("sessionId", CURRENT_SESSION_ID)        };        var customerStream = await client.PostAsync("List/CustomerBankAccount.json", new FormUrlEncodedContent(nvc));        var customerString = await customerStream.Content.ReadAsStringAsync();        //....    }    public async Task<List<Dto2>> Method2(int start, int count)    {        List<KeyValuePair<string, string>> nvc = new List<KeyValuePair<string, string>>        {            new KeyValuePair<string, string>("sessionId", CURRENT_SESSION_ID)        };        var customerStream = await client.PostAsync("List/Method2.json", new FormUrlEncodedContent(nvc));        var customerString = await customerStream.Content.ReadAsStringAsync();        //....    }    // logic to get SessionId here    public async Task LoginAsync()    {    }如何實(shí)施以保存此sessionId內(nèi)部服務(wù)?有很多選項(xiàng)可以實(shí)現(xiàn):Login每次調(diào)用方法之前調(diào)用方法。易于實(shí)現(xiàn),但方法不好,因?yàn)槟菚r(shí)我們有很多不必要的請求并且sessionId只使用一次保存sessionIdweb 應(yīng)用程序級別并嘗試捕獲異常,當(dāng)任何方法返回“無效 sessionId”時(shí),然后調(diào)用Login方法,該方法將返回一個(gè)新的sessionId. 在這種情況下,我們必須傳遞sessionId給類的構(gòu)造函數(shù)BillRequest。它可以工作,但我不喜歡將服務(wù)責(zé)任轉(zhuǎn)移給其他人,因?yàn)槿绾问褂?API 是服務(wù)的內(nèi)部責(zé)任。保存sessionId在服務(wù)本身內(nèi)部并在服務(wù)內(nèi)部調(diào)用Login方法,當(dāng)舊sessionId的被認(rèn)為無效時(shí),用新的等重寫它。但是如何將其保存為內(nèi)存中的“靜態(tài)”?我不想將它保存到任何外部位置(文件系統(tǒng)、云等),但我也不能保存到類的變量中,因?yàn)榭梢灾匦聞?chuàng)建類的對象......
查看完整描述

1 回答

?
心有法竹

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊

我建議在這里對函數(shù)式編程進(jìn)行一定的心理轉(zhuǎn)變。

sessionID其視為獨(dú)立值而不是單個(gè)對象。然后可以通過以下(語義等效)方式重新定義您的問題:給定一個(gè)類型化的流(string在您的情況下),如何觀察其流程并對傳入的更改做出反應(yīng),而您的源代碼無法控制?

嗯,有一個(gè)由 Enterprise? 證明的答案:反應(yīng)式擴(kuò)展。

從技術(shù)上講,這種轉(zhuǎn)變意味著您正在處理IObservable<string>控制器的內(nèi)部,它可以通過標(biāo)準(zhǔn)的 .NET Core DI 方法注入,或者簡單地由構(gòu)造函數(shù)定義。這是非常靈活的,因?yàn)?code>rX它為您提供了完全可測試、令人難以置信的強(qiáng)大工具集來處理此類任務(wù);rX也與本機(jī)兼容,Task因此也與async/await功能兼容。不錯(cuò)的事實(shí)是,從外部世界注入所需的行為并用更合適的行為來裝飾現(xiàn)有的 observable 非常容易:因此,您是安全的:一旦第 3 方的服務(wù)邏輯發(fā)生更改,您幾乎可以立即輕松地采用您的代碼庫。

里面會(huì)是什么IObservable<string>?好吧,我不能說,因?yàn)槟銢]有提供足夠的信息。這可能是一個(gè)間隔,詢問遠(yuǎn)程服務(wù)器當(dāng)前sessionID是否仍然有效,如果不是 - 運(yùn)行重新登錄程序并通知它的訂閱者新值;它可能是一個(gè)負(fù)責(zé)編譯時(shí)已知過期規(guī)則的計(jì)時(shí)器rX,它可能是您需要的復(fù)雜邏輯:足夠靈活,不會(huì)限制您使用它可以實(shí)現(xiàn)的目標(biāo),只要您處理(可能是無限的)流.

因此,這意味著您不需要任何全局值。只需訂閱會(huì)話 ID 流并獲取最新的 - 當(dāng)前有效的,完成工作并處理您的訂閱。它貴,不會(huì)影響性能;兩者都不會(huì)破壞并發(fā)性。如果您想堅(jiān)持一種常見的 .NET 方式,請rX使用它Task。await

PS 交付實(shí)施所需的 99% 已經(jīng)存在;你只需要結(jié)合它。


查看完整回答
反對 回復(fù) 2022-07-10
  • 1 回答
  • 0 關(guān)注
  • 152 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號