ASP.NET MVC - Работа контроллеров - PullRequest
3 голосов
/ 06 августа 2009

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

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 06 августа 2009

У вас есть специальные модели ViewModel и Poco-модели? В этом случае вы можете обрабатывать данные из сервисов внутри 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);

}

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

2 голосов
/ 06 августа 2009

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

...