IRequest / IResponse Pattern - PullRequest
       9

IRequest / IResponse Pattern

0 голосов
/ 28 мая 2010

Я пытаюсь создать шаблон запроса / ответа на основе интерфейса для запросов веб-API, чтобы разрешить асинхронную обработку потребителя / производителя, но не уверен, как узнать, что представляет собой базовый класс IResponse.

public void Run()
{
   List<IRequest> requests = new List<IRequest>();
   List<IResponse> responses = new List<IResponse();
   requests.Add(AmazonWebRequest); //should be object, trying to keep it simple
   requests.Add(EBayWebRequest);  //should be object, trying to keep it simple

   foreach (IRequest req in requests)
   {
      responses.Add(req.GetResponse());
   }

   foreach (IResponse resp in response)
   {
      typeof resp????
   }
}

interface IRequest
{
   IResponse GetResponse();
}

interface IResponse
{
}

public class AmazonWebServiceRequest : IRequest
{
   public AmazonWebServiceRequest()
   {
      //get data;
   }

   public IResponse GetResponse()
   {
      AmazonWebServiceRequest request = new AmazonWebServiceRequest();
      return (IResponse)request;
   }
}

public class AmazonWebServiceResponse : IResponse
{
   XmlDocument _xml;
   public AmazonWebServiceResponse(XmlDocument xml)
   {
      _xml = xml;
      _parseXml();
   }

   private void _parseXml()
   {
      //parse Xml into object;
   }
}

public class EBayWebRequest : IRequest
{
   public EBayWebRequest ()
   {
      //get data;
   }

   public IResponse GetResponse()
   {
      EBayWebRequest request = new EBayWebRequest();
      return (IResponse)request;
   }
}

public class EBayWebResponse : IResponse
{
   XmlDocument _xml;
   public EBayWebResponse(XmlDocument xml)
   {
      _xml = xml;
      _parseXml();
   }

   private void _parseXml()
   {
      //parse Xml into object;
   }
}

1 Ответ

1 голос
/ 28 мая 2010

Вы можете проверить тип следующим образом:

if (resp.GetType() == typeof(AmazonWebRequest))
{
// do something
}
else if (resp.GetType() == typeof(EBayWebRequest))
{
// do something
}

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

resp.Process();

Затем обработайте запрос внутри каждой реализации IResponse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...