Является ли этот дизайн хорошим способом доступа к веб-сервису в стиле MVC? - PullRequest
2 голосов
/ 11 марта 2012

РЕДАКТИРОВАТЬ: Моя конечная цель - полностью отделить ASIHTTPRequest и ModelListingViewController, чтобы я мог сделать self.modelArray = [Model arrayOfModelWithDelegate:self] и, возможно, реализовать несколько моих собственных обратных вызовов, а не ASI.

IСоздано несколько приложений для iPhone, использующих сервис RESTful и ASIHTTPRequest.Я никогда не был доволен тем, как они спроектированы, так как я всегда чувствую, что классы контроллера синтаксического анализа, модели и представления тесно связаны.Для моего следующего обновления приложения я хотел бы использовать этот дизайн для доступа к веб-службе:

ModelListingViewController --- self ---> Model +(NSArray*)arrayOfModelWithDelegate:MLVC

+(NSArray*)arrayOfModelWithDelegate ---> ModelWSController:WSController +(NSArray*)getAllModel

в WSController:

@property (nonatomic, strong) ASIHTTPRequest *request;
...
- (void)performRequest {
   //global request stuff, like authentication, headers, etc
   [request startAsynchronous];
}

в ModelWSController:

- (NSArray *)getAllModelWithDelegate:(id)delegate {
    request.url = @"Appropriate URL"; //or could use a more sophisticated internal url routing system defined by model class name
    request.delegate = delegate;
    [ModelWSController performRequest];
}

и в ModelListingViewController:

self.arrayOfModel = [Model arrayOfModelWithDelegate:self];

Что-то не так с этим дизайном, особенно в том, как ModelWSController и WSController связаны, но яне знаю, что.В частности, передача delegate два раза по цепочке кажется странной.

Вклад приветствуется, и я хотел бы знать, как вы разработали, используя принципы MVC для доступа к веб-сервису RESTful.Также, пожалуйста, дайте мне знать, если бы блоки были лучшим способом справиться с этим.

1 Ответ

1 голос
/ 13 января 2013

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

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

Инфраструктуры внедрения зависимостей для iOS, такие как Возражение помогают сделать это изменение конфигурации очень маленьким.

...