2017-01-11 55 views
0

我有一個將處理異步套接字的服務。我將有幾種不同的請求類型可以被這個服務接收,但是我想避免使用任何類型的switch語句來決定如何處理接收到的數據。在服務上處理不同類型的異步套接字接收數據

現在,我有一個請求對象將包含發件人信息,請求類型和一個通用對象,其中將包含與請求有關的信息。例如:

例如:登錄請求將使用名稱/密碼散列發送。

我能想到的來處理這些一旦被重建的唯一方法是有,說

if (requestType = 0) 
    HandleLogin(receivedData); 
else if (requestType = 1) 
    HandleDataRequest(receivedData); 

我認爲抽象的,但我想,因爲類需要共享一個大的switch語句客戶端/服務器爲了進行序列化和反序列化,客戶端也將具有服務器邏輯。

class LoginRequest : Request 
{ 
    public override void HandleRequest() 
    { 
      // Server logic here. But then client 
      // would have this useless logic in it's library. 
    } 
} 

如果有人能指出我在正確的方向,我將不勝感激!

+0

我通常在switch語句中嘗試TypeOf()。 – jdweng

+0

這肯定比int requestType開關更好,使其更具可讀性。但我希望避免轉換語句完全贊成抽象。我不知道它是否可行,或者這是大多數異步套接字接收函數的工作方式。 – Datastream

回答

0

如果您使用的是C#4.0+,並且您在編譯時已知完整的請求類型集(這聽起來像是),那麼可以使用dynamic關鍵字和方法重載來避免使用switch語句。

首先,爲每種類型的請求創建一個句柄方法的版本。

void HandleRequest(LoginRequest request) 
{ 

} 

void HandleRequest(DataRequest request) 
{ 

} 

然後,創建一個動態類型的請求數據實例,並用它來調用您的重載方法。

dynamic request = receivedData; 
HandleRequest(request); 
+0

我喜歡這種方法。我肯定會試一試。謝謝! – Datastream

+0

僅供參考,即使你沒有顯示它,我假設你的receivedData變量是Request類型,它似乎是所有具體請求類型的基礎。如果這是真的,那麼這段代碼應該按原樣工作。如果沒有,那麼你需要做一些調整,可能會首先將receivedData轉換爲請求對象。 – Sacrilege

+0

他們都有「請求」的基礎,但我最終稱之爲。我擔心的是必須在它們中放置一個HandleRequest()覆蓋函數,這實際上超出了他們應該做的。感謝您的領導! – Datastream