У меня есть сайт asp.net-mvc со следующими папками:
- Контроллеры
- Сценарии
- представления
- ViewModels
- Модели
- DomainModel
Теперь я хочу получить доступ к большому количеству этой бизнес-логики и кода доступа к базе данных и данных в другом приложении .net(приложение для консоли Windows, а не в Интернете), поэтому я рефакторинг , чтобы удалить как можно больше материалов вне проекта MVC и в другие проекты в решении, чтобы код мог использоваться совместно с другими решениями.
У меня есть две основные проблемы:
-
Моя основная проблема заключается в том, что я изо всех сил пытаюсь найти место для размещения кода, который генерирует ViewModel, потому что многие из этого кода я хотел бы повторно использовать в своем консольном приложении, поскольку консольное приложение отправляет электронное письмо, которое требует те же данные, что и в представлении.
-
Еще одна важная проблема заключается в том, что я изо всех сил пытаюсь понять, как я могу переместить код доступа к базе данных из проекта MVC, но все еще имея ViewModels внутри, когда многие из моих функций, которые создают экземпляр моих моделей просмотра, начинаются с кучи базы данных код доступа.
Вот немного деталей и моего процесса:
Шаг 1 - Переместите DomainModel в другой проект - успех
Поэтому перемещение проекта DomainModel было простым (так как на нем было много необработанных объектов с какой-то бизнес-логикой),
Шаг 2 - Тонкие контроллеры - успех
Я уменьшил как можно больше моих контроллеров и переместил любую логику бизнеса или сложную логику доступа к данным в папку "Модели". Когда я попытался переместить папку моделей за пределами проекта MVC, произошло несколько вещей:
Шаг 3 - Попытка перемещения папки моделей за пределы проекта MVC - борьба
При прореживании контроллеров у меня есть несколько различных действий контроллера, которые идут в класс модели и возвращают мой ViewModel, который я возвращаю обратно в представление. Что-то вроде этого (в моем классе контроллера):
public ActionResult ApplicationDetail(int id)
{
AppDetailViewModel applicationViewModel = Model.GenerateAppDetailViewModel(id);
return View(applicationViewModel);
}
Таким образом, файлы в папке Model зависят от классов ViewModel. Я хочу централизовать функцию GenerateAppDetailViewModel(), которая используется в нескольких разных контроллерах. Кроме того, в моем консольном приложении (которое отправляет сообщение по электронной почте, я часто хочу получить все данные, которые случаются на каком-то представлении, поэтому мой код "хочет" также использовать модель просмотра. Если я выведу ее из проекта MVC то я могу повторно использовать, но я думаю, что проблема с зависимостями (я не нуждаюсь в SelectListItem в моем консольном приложении, но в других случаях, когда они являются просто контейнерами для разных данных, необходимых для создания представления, которое я хочу повторно использовать)
или другая вещь, которая сломалась, была зависимость от:
System.Web.Mvc
потому что у меня много кода, который:
- запрашивает таблицу в базе данных
- Преобразует это в коллекцию объектов (я использую nhibernate)
- Преобразуйте это в какой-либо объект DTO (который находится в папке ViewModels) или объект List of SelectListItem (который будет использоваться для заполнения выпадающих списков в представлении), который является частью System.web.mvc.
Я хотел найти предложения по наилучшему способу вывести эту зависимость, чтобы я мог перемещать как можно больше кода из проекта MVC для повторного использования.
Проблема в том, что если я попытаюсь сосать мой код ViewModel в папку Model и в другой проект, то снова я застрял, потому что классы ViewModel имеют большую зависимость от
System.Web.Mvc
из-за таких вещей, как SelectListItem.
Должен ли я иметь 2 папки моделей моделей (один из проектов MVC с конкретными ссылками system.web.mvc и другой, который находится в другом проекте?). Похоже, что зависимость от SelectListItem - это то, что вызывает конфликты
В большинстве примеров, которые я видел, ViewModels имеют зависимость от System.Web.Mvc например, этот учебник
Я видел следующие вопросы:
- Вопрос рефакторинга SelectList Asp.Net MVC
- Где следует выбирать логику выбора в ASP.NET MVC, представлении, модели или контроллере?
которые являются родственными, но не уверены, что они отвечают на мой конкретный общий вопрос рефакторинга.