ASP.NET MVC - Работа контроллеров

Я думаю, что меня начинает смущать работа контроллера в MVC.

У меня есть сервис, который предоставляет пять функций:

  • список пакетов в очереди
  • получить пакет
  • удалить пакет
  • принять пакет
  • отклонить пакет

Мой контроллер ASP.NET MVC зависит от этой службы и обычно может выполнять вызов службы для действия. Я пока доволен.

Вторая часть затем создает результат ViewModel. Если я сделаю это внутри контроллера, у контроллера теперь есть расширяющийся список зависимостей - каждое добавленное действие увеличивает зависимости для построения модели представления, и все они наследуются контроллером. Мне это очень не нравится. Я создаю этот контроллер, который зависит от N различных построителей модели представления, но использую только один из них для каждого запроса.

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

У меня возникает вопрос: какова ответственность контролера? Если я в конечном итоге вытягиваю построение модели представления в фильтры, мой контроллер делает немного больше, чем заставляет маршрут выполнять вызов службы (и предоставляет плагин фильтра). Если вместо этого я оставлю свой контроллер ответственным за построение каждой модели представления, это станет беспорядком.

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


person anonymous    schedule 06.08.2009    source источник
comment
Этот вопрос остро нуждается в некоторых примерах кода.   -  person John Sheehan    schedule 24.08.2009


Ответы (2)


У вас есть специальные модели ViewModels и Poco-Models? В этом случае вы можете обрабатывать данные из сервисов внутри ViewModel. Меня вполне устраивает этот скандал.

public class PackageViewModel()
{
    public PackageDetail{get;set;}
    public int PackageID{get;set;}
    public List<Package>Packages{get;set;}
    public string SomeFilterCriteria{get;set;}

    publlic void FillPackageList(IPackageService packageService)
    {       
        Packages = packageService.GetPackages(SomeFilterCriteria);      
    }
}

В контроллере:

public ViewResult ListPackages(PackageViewModel model)
{
    model.FillPackageList(PackageService);
    return View("ListPackages",model);

}

Я не понимаю, что вы подразумеваете под «построителями моделей представлений».

person Mathias F    schedule 06.08.2009
comment
Создатели модели представления могут иметь в виду присвоение значений из DTO объекту модели представления. В настоящее время я делаю это в своих контроллерах - не уверен, что это правильный ход или нет, но альтернатива, которую я вижу, - это передача DTO конструктору модели представления, что, я не уверен, лучше. - person Sinjai; 26.09.2017

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

person Jim Schubert    schedule 06.08.2009