2017-01-11 3 views
0

У меня есть служба, которая будет обрабатывать асинхронный сокет. У меня будет несколько разных типов запросов, которые будут получены этой службой, но я хочу избежать того, чтобы какой-либо оператор switch определял, как обрабатывать полученные данные.Обработка различных типов асинхронных сокетов полученных данных на службе

Прямо сейчас у меня есть объект запроса, который будет содержать информацию об отправителе, тип запроса и общий объект, который будет содержать информацию, связанную с запросом.

Ex: Запрос на вход будет отправлен с хешем имени/пароля.

Единственный способ, которым я могу думать, чтобы справиться с этим, как только они были реконструированы, чтобы иметь большое заявление переключатель, который говорит

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

Я думал, абстракции, но я думаю, так как классы должны быть разделены клиентом/сервером, чтобы быть сериализованным и десериализованным, клиент будет иметь логику сервера и в своем классе.

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

Если кто-то может указать мне в правильном направлении, я был бы признателен!

+0

Обычно я пытаюсь использовать TypeOf() в инструкции switch. – jdweng

+0

Это определенно лучше, чем переключатель int requestType, делая его более читаемым. Но я надеюсь избежать заявлений о переключении полностью в пользу абстракции. Я не знаю, возможно ли это, или если это так, как будут работать большинство функций, получающих асинхронный сокет. – Datastream

ответ

0

Если вы используете C# 4.0+, и если ваш полный набор типов запросов известен во время компиляции (это звуки), вы можете использовать перегрузку динамического ключевого слова и метода, чтобы избежать использования оператора switch.

Сначала создайте версию метода дескриптора для каждого типа запроса.

void HandleRequest(LoginRequest request) 
{ 

} 

void HandleRequest(DataRequest request) 
{ 

} 

Затем создайте динамически типизированный экземпляр ваших данных запроса и используйте его для вызова перегруженного метода.

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

Мне нравится этот подход. Я дам ему шанс. Благодаря! – Datastream

+0

FYI, хотя вы его не показывали, я предполагал, что ваша переменная receivedData имеет тип Request, который, как представляется, является базой для всех ваших конкретных типов запросов. Если это правда, тогда этот код должен работать нормально как есть. Если нет, то вам нужно будет внести некоторые изменения и, возможно, сначала перенести полученные данные в объект запроса. – Sacrilege

+0

У всех будет база «Запрос», или, в конце концов, я позвоню. Мое беспокойство заключалось в том, что в них была включена функция переопределения HandleRequest(), что действительно за пределами того, что они должны делать. Спасибо за головы! – Datastream