2015-03-06 2 views
0

Я разрабатываю программу на C#, которая должна выполнять различные запросы HTTP для получения различной информации (цена определенного товара в регионе, история цен для объекта, маршрут между двумя регионами и т. д.).Как передать различные параметры для разных классов запросов HTTP, которые реализуют один и тот же интерфейс

Я начал путем реализации интерфейса IRequest, который содержит два свойства, что все запросы должны иметь:

public interface IRequest 
{ 
    ReturnDataType DataReturnType { get; } 

    HttpWebRequest HttpRequest { get; } 
} 

public enum ReturnDataType 
{ 
    Xml, 
    Json 
}; 

Я хотел бы добавить в этом интерфейсе список (или любой другой контейнер), который будет содержать параметры для запроса (для добавления в URL), чтобы я мог получить к ним доступ, ссылаясь на интерфейс IRequest. К сожалению, поскольку каждый HTTP-запрос необязательно имеет один и тот же запрос, и не обязательно в том же порядке, если они это делают, я не знаю, как этого добиться. Единственное решение, которое я придумал, состоит в том, чтобы в интерфейсе иметь List<String> и полагаться на программиста, чтобы прочитать, что параметр x всегда должен быть первым в списке для http-запроса a, параметра y second и т. Д., Параметр z всегда сначала для http-запроса b и т. д.

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

ответ

1

Вы можете сделать следующее:

public class GetItemPriceRequest: IRequest 
{ 
     public string ItemNumber {set;get;} 
     public string UserName {set;get;} 
} 

public GetItemHistoryRequest: IRequest 
{ 
     // my properties 
} 

и так далее для каждого запроса. И иметь класс ответа для каждого запроса. Этот путь более чист и организован. Кроме того, вы знаете, какие параметры ожидать на основе типа объекта запроса. Значение, если переданные объекты запроса имеют тип GetItemPriceRequest; то я должен увидеть поле ItemNumber.

Я надеюсь, что это поможет вам решить вашу проблему. сообщите мне, если у вас есть проблемы.

+0

У меня есть фабрика, которая создает соответствующий запрос и возвращает 'IRequest'. Если я сделаю следующее: «GetItemPriceRequest request = (GetItemPriceRequest) RequestFactory (GetItemPriceRequestString)», будет ли у меня доступ к «ItemNumber» и «UserName», если эти свойства уже заполнены? – Choub890

+0

GetItemPriceRequestString - это имя класса? или что это? вы должны получить доступ к номеру товара и имени пользователя, пока вы делаете актерский состав – alsafoo

+0

Извините, настоящая подпись для моей фабрики - это 'CreateApiRequest (ApiRequestType requestType)' где 'ApiRequestType' - это перечисление, указывающее, какой запрос мы хотим создать. Просто для подтверждения, если в конструкторе класса GetItemPriceRequest я заполняю значения «ItemNumber» и «UserName» со значениями, у меня будет доступ к этим значениям (как заполняется в конструкторе), даже если он возвращается с помощью «CreateApiRequest» (ApiRequestType requestType) 'как IRequest? – Choub890

1

В качестве дополнения вы можете найти полезный Command design pattern - он инкапсулирует запрос команды как объект. Кроме того, вы можете параметризовать клиентов с различными запросами, запросами на очереди или журналами и поддерживать отмененные операции.

И как

делать различные запрос HTTP, чтобы получить различные виды информации

может помочь вам ParameterObject - она ​​имеет дело с цепочкой вызовов (более подробно here).

Смежные вопросы