Рефакторинг кода контроллера MVC. Контроллер или модель - PullRequest
1 голос
/ 15 апреля 2011

У меня много кода в контроллере, и я не уверен, куда его поместить. Сначала я изменил его так, чтобы он был СУХИМ, но все еще находился в контроллере.

Какое хорошее руководство следует соблюдать при перефакторинге кода, например, когда что-то перемещать в модель и когда что-то держать в контроллере?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

Ваша модель обычно не должна содержать бизнес-логики. Если это так, извлеките эту модель в ViewModel, и единственная логика в ней должна быть вашим кодом, связанным с отображением. Любые бизнес-методы должны существовать в отдельном классе. Некоторые предпочитают использовать ViewModels все время вместо общих моделей (например, CustomerEditViewModel вместо просто Customer model).

Контроллер должен быть очень легким и не иметь кода доступа к данным. Обычно я называю метод репозитория ( Шаблон репозитория ) для простой загрузки данных и Шаблон фасада в качестве шлюза для любых выполняемых бизнес-методов.

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

CustomerRepository repository = new CustomerRepository();
Customer customer = repository.GetCustomer(customerId);
// call some business methods, assign data, etc.
..
..
// now save
repository.SaveCustomer(customer);

Ваш класс репозитория обычно закодирован для интерфейса; это делает вывод данных / насмешки над этими классами для загрузки «поддельных» данных чрезвычайно простым, а также отделяет ваш контроллер и фасад от прямой связи с конкретной реализацией класса, но вместо этого с интерфейсом.

2 голосов
/ 15 апреля 2011

Контроллер должен в первую очередь содержать код координации.Так что, если по какой-то причине у вас есть код, выполняющий какую-либо бизнес-функцию или функцию домена, вы можете переместить на .Я склонен использовать сервисы приложений или простые задачи.Что-то вроде IImageService или IDocumentService (хотя реализации могут стать довольно раздутыми).Мне также нравится использовать отдельные задачи, такие как ILoginTask.

Затем внедряются реализации (я использую Castle Windsor с фабрикой пользовательских контроллеров).

Просто мой 2c --- HTH

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