MVC: Ответственность контроллера - PullRequest
2 голосов
/ 27 августа 2010

У меня есть некоторые сомнения относительно следующего действия контроллера (в ASP.NET MVC, но это более общий вопрос):

public ActionResult DoSomething( int id, IUser currentUser )
{
     var myDomainObject = businessService.GetDomainObjectById( id );

     if( !securityService.CurrentUserCanAcess( currentUser, myDomainObject ) )
     {
         throw new HttpException(403, "forbidden");
     }

     if( workflowService.IsWorkflowFinishedFor( myDomainObject ) )
     {
         return RedirectToAction( "OtherAction", identifier );
     }

     var myModel = entityToModelMapper.GetModel( myDomainObject );

     return View( myModel );
}

workflowService, securityService, businessService и entityToModelMapper все вводятся в мой контроллер с IoC.

Я обеспокоен тем, чтобы безопасность, бизнес и рабочий процесс были связаны с одним и тем же действием контроллера. Это нормально?

Ответы [ 2 ]

1 голос
/ 27 августа 2010

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

Может возникнуть вопрос, подходит ли какой-либо рефакторинг.Например, кто должен проверять права доступа пользователя?Здесь класс действия выполняет проверку, а объект myDomain, по-видимому, позволяет кому-либо читать его содержимое.

Аналогично проверка завершения рабочего процесса: если код действия забывает выполнить эту проверку, что происходит?

Мне кажется, что в текущем проекте, когда он распространяется на многие методы действий, это

Кодеры, пожалуйста, помните, чтобы проверить права доступа и состояние рабочего процесса

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

Поэтому я думаю, что какой-то рефакторинг вставит это в объект домена, или подходящая обертканеобходимо.

1 голос
/ 27 августа 2010

IMO - это чистый дизайн, который должен быть «простым» в обслуживании. Он может быть кандидатом в МОК, чтобы помочь в тестировании, и т. Д., Поэтому вы не создаете конкретные экземпляры некоторых объектов, которые используете, но кроме этого они выглядят хорошо (опять же IMO).

Обычно я смотрю на то, насколько "веб" действие переносимо на другую технологию (например, формы Windows). Так что в этом случае, если бы вы переместили основной код в другое приложение, ваш «пользователь» мог бы быть решен по-другому, и действие, если они не авторизованы, определенно было бы другим, поэтому я думаю, что это хорошо, чтобы быть отдельным вызовом. Тогда у вас есть основная обработка, снова приятно отделены. Наконец, тогда и только тогда вы отображаете бизнес-объект, который возвращается в красивую модель представления.

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

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