Я пришел из мира WebForms, где вся логика находится в коде позади aspx-страниц. Прочитав несколько книг по ASP.NET MVC, прослушав некоторый подкаст и посмотрев несколько видео на Tekpub, я решил, что пришло время взглянуть на вещи немного по-другому.
К сожалению, я уже застрял.
Я пытаюсь создать какую-то небольшую и простую CMS, в которую я могу добавить несколько веб-сайтов.
Я знаю, что я должен держать свои контроллеры тонкими, поэтому я думаю, что я должен использовать какой-то класс обслуживания (давайте назовем его WebsiteService), чтобы сделать это. Я использую Entity Framework для доступа к данным, и все мои представления используют определенные ViewModels. Когда я создаю или редактирую сайт, должны произойти следующие четыре вещи:
- Подтвердить ввод
- Добавить информацию о Веб-сайте в базу данных (Обновите информацию, если это Правка)
- Создать каталог на диске (возможно, переименовать каталог, если это Edit)
- Добавление заголовка узла на веб-сайт IIS (возможно удалить старый заголовок узла и новый, если он является правкой)
По сути, я полагаю, что WebsiteService должен выполнить более продвинутую проверку, записать в базу данных, создать / отредактировать каталог, добавить / удалить заголовки хоста и вернуть что-то контроллеру, чтобы указать, успешно это или нет.
Как должен выглядеть этот класс? У меня есть несколько вопросов, на которые я не знаю ответа.
- Должен ли WebsiteService также преобразовывать ViewModel CreateWebsite в фактический класс Website или что-то еще делать так, чтобы WebsiteService принимал фактический объект Website?
- Базовая проверка входных данных выполняется с использованием атрибутов Validation в ViewModel. Также следует провести более тщательную проверку («Есть ли уже сайт с таким доменным именем в базе данных?»). Должен ли это делать и сервис WebsiteService?
- Должны ли все 3 шага (сохранить в базе данных, создать каталог, добавить заголовок узла в IIS) одним открытым методом (
WebsiteService.SaveWebsite(ViewModels.CreateWebsite website)
) или я должен предоставить отдельные методы, которые должен вызывать контроллер? (Наверное, нет, потому что я полагаю, что порядок вызовов важен.)