自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為點對點消息隊列設(shè)計托管接口

開發(fā) 后端
本文介紹了為點對點消息隊列設(shè)計托管接口時需要考慮的方面。

為點對點消息隊列設(shè)計托管接口

在為任何本機 API 集設(shè)計托管接口之前,首先需要查看它是否已經(jīng)實現(xiàn)了。對于點對點消息隊列,沒有現(xiàn)成的庫且搜索結(jié)果只提供有關(guān) API 描述的少量信息。由于之前很少涉足該領(lǐng)域,因此描述針對點對點消息 API 的托管包裝的設(shè)計和實現(xiàn)看起來是值得的。

當(dāng)開發(fā)人員將一組相關(guān) Win32 API 包裝到一個或多個托管類中時,會使用一個通用模式;大多數(shù) Windows API 都操作一個句柄(并將其視為它們的***個參數(shù))。從面向?qū)ο蟮慕嵌瓤?,可將該句柄看作對象?biāo)識。您可以將與句柄相關(guān)的所有方法分組到公開相同方法的類中。除不需要該句柄之外,這些方法擁有與原始方法相同的簽名。該句柄在對象創(chuàng)建時獲取,在對象處置/析構(gòu)時關(guān)閉。在 .NET Compact Framework 中,句柄由 IntPtr 類型表示。因此,根據(jù)前面的信息,您可以按以下方式創(chuàng)建包裝特定本機 API 的類。
+ constructor(String name, MsgQueueOptions opt)
+ ReadMsgQueue(byte[] buf, Int32 bufSize, Int32 numRead, Int32 timeout, Int32 flags)
+ WriteMsgQueue(byte[] buf, Int32 bufSize, Int32 timeout, Int32 flags)
+ GetMsgQueueInfo(MsgQueueInfo info)
+ Close()

上述代碼示例中的五個方法可以形成主接口,但是還要用托管代碼定義 MsgQueueOptions 和任何其他結(jié)構(gòu)(如同在平臺調(diào)用中使用的非托管結(jié)構(gòu)所做的那樣)。該接口是一個不錯的開端并為您提供了一個包裝,但它并不是完全面向?qū)ο蟮牟⑶也贿m用于 .NET Compact Framework 的其他部分,而且它給客戶端帶來了較大的額外負(fù)擔(dān)(就要編寫的代碼而言)。該接口仍然可以改進(jìn)。

無論在何處引入方法的重載都應(yīng)該這樣做,以便簡化客戶端代碼必須處理的方法。例如,如果需要創(chuàng)建一個無名隊列,則客戶端不一定要傳入 NULL — 進(jìn)一步說,name 參數(shù)不應(yīng)該在構(gòu)造函數(shù)中。如果需要以阻塞方式讀取或?qū)懭雽α?,而不是?INFINITE (-1) 作為 timeout 參數(shù)進(jìn)行傳遞,則不一定要傳遞任何內(nèi)容。應(yīng)用這些更改將增加類中的方法數(shù)量,而且將使它更易于在較簡單的方案中使用,同時不會限制更復(fù)雜的情況。

該接口可以進(jìn)一步改進(jìn)。注意,需要傳遞字節(jié)數(shù)組以及該數(shù)祖的大小的方式;傳遞數(shù)組大小不是必要的,因為可在任何時間確定給定數(shù)組的大小。除非在簽名中顯式需要數(shù)組長度(例如,出于性能原因的考慮,因為緩存該大小比每次重新計算它要快),否則可以刪除 bufSize 參數(shù)。實際上,可將字節(jié)數(shù)組參數(shù) (buf) 與 flags 參數(shù)(它指明該信息是否為一個警告信息)一起封裝到它自己的類型/類之中。

另一個使 API 更加面向?qū)ο蟮姆椒ㄊ窍Y(jié)構(gòu) — 這很有意義。例如,您不必設(shè)置結(jié)構(gòu)并將其傳遞給構(gòu)造函數(shù),而是可以將結(jié)構(gòu)元素作為參數(shù)與適當(dāng)?shù)闹剌d內(nèi)聯(lián)(換言之,可以使結(jié)構(gòu)成員變?yōu)橐幌盗袇?shù))。與返回帶有隊列信息的結(jié)構(gòu)相比,更好的解決方案是將結(jié)構(gòu)字段內(nèi)聯(lián)到類本身上的只讀屬性。

您應(yīng)該能回想起本文***部分中的兩個事實:與其他許多方法一樣,點對點消息隊列 API 方法返回 BOOL 來指示成功或失敗,而且擴展的錯誤信息需要一個單獨的調(diào)用??梢允褂脙蓚€非獨占方法來映射該行為(即,返回布爾值以及需要單獨檢索擴展的錯誤信息)。***個方法是使應(yīng)用程序在發(fā)生錯誤時引發(fā)一個異常,并使該異常帶有擴展的錯誤信息。第二個方法是使應(yīng)用程序返回包含該方法調(diào)用的可能結(jié)果(包括成功)的枚舉。作為一個通用原則,開發(fā)的應(yīng)用程序應(yīng)該僅在狀況無法恢復(fù)時才引發(fā)異常。

在該階段,在 .NET Framework 中查找相似類是很有用的,并且您肯定能在 System.Messaging(在 .NET Compact Framework 版本 2.0 中也可用)中找到 MSMQ 類。您可以采用該類的成員所使用的相同命名約定(例如,將 Read 更改為 Receive,并將 Write 更改為 Send)。注意,MSMQ 類如何提供一個用于清空隊列中消息的 Purge 方法。您可以通過該方法增強自己的類;換言之,雖然本機 API 不提供方法,但這并不意味著您無法通過添加一個方法來向包裝添加值。

由于 OpenMsgQueue 方法返回一個句柄,并且您已將該句柄映射到一個類,因此包裝方法返回包裝類的實例是很有意義的。此外,該方法在執(zhí)行時不需要現(xiàn)有狀態(tài),因此您應(yīng)該使它成為靜態(tài)的。***,需要將該結(jié)構(gòu)轉(zhuǎn)化為所需的單個參數(shù):它是只讀隊列還是只寫隊列。

請注意,這里不描述平臺 invoke 聲明。

以上就介紹了為點對點消息隊列設(shè)計托管接口時需要考慮的方面。

【編輯推薦】

  1. 點對點消息隊列函數(shù):用于WinCE的IPC機制
  2. ASP.NET中無Cookie會話的優(yōu)點與缺點
  3. 無Cookie會話的實現(xiàn)
  4. ASP.NET Cookie:不是問題的問題
  5. .NET框架中的XML:XmlSerializer的內(nèi)部原理
責(zé)任編輯:yangsai 來源: MSDN
相關(guān)推薦

2009-08-06 16:17:05

點對點消息隊列

2017-10-11 15:08:28

消息隊列常見

2021-05-31 08:00:00

消息隊列架構(gòu)Rabbit MQ

2024-10-16 15:11:58

消息隊列系統(tǒng)設(shè)計

2017-04-27 10:07:52

框架設(shè)計實現(xiàn)

2019-10-22 08:12:49

消息隊列分布式系統(tǒng)

2010-04-21 12:39:48

Unix 消息隊列

2017-02-27 14:25:50

Java隊列Web

2009-12-07 09:23:05

2022-04-12 11:15:31

Redis消息隊列數(shù)據(jù)庫

2012-09-24 11:48:05

IBMdw

2009-11-09 11:15:06

WCF消息隊列

2021-02-19 09:19:11

消息隊列場景

2010-04-21 12:12:56

Unix 消息隊列

2010-04-13 17:00:43

Unix消息隊列

2025-04-09 08:20:00

RocketMQ消息隊列開發(fā)

2009-11-09 16:57:05

WCF托管特性

2021-09-22 14:36:32

鴻蒙HarmonyOS應(yīng)用

2021-03-11 06:01:41

Linux消息隊列

2010-04-21 14:49:13

Unix消息隊列
點贊
收藏

51CTO技術(shù)棧公眾號