2017-01-11 53 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