Я бы сказал, что все в порядке. Аргумент, который создает зависимость от базы данных, является ложным аргументом по 2 причинам:
1- Доступ к базе данных должен быть ограничен через интерфейсы репозитория. Интерфейсы репозитория являются частью модели предметной области, а их реализация является частью уровня инфраструктуры / доступа к данным. Таким образом, нет никакой зависимости от базы данных.
2 - Связующие и контроллеры моделей являются частью уровня представления, реализованного с использованием ASP.NET MVC Framework. Если Контроллерам разрешен доступ к базе данных с использованием интерфейсов репозитория, почему модели Binder не разрешены?
Кроме того, существуют ситуации, когда вам «лучше» заполнить недостающие данные в вашей модели из связывателей моделей. Рассмотрим сценарий, в котором у вас есть раскрывающийся список. При первой загрузке представления заполняется раскрывающийся список. Пользователь отправляет форму, но проверка не проходит. Так что вам нужно будет вернуть форму снова. На этом этапе вам нужно будет заново заполнить список в модели для раскрывающегося списка. Делать это в контроллере выглядит некрасиво:
public ActionResult Save(DocumentViewModel viewModel)
{
if (!ModelState.IsValid)
{
viewModel.Categories = _repository.GetAll();
return View(viewModel);
}
}
Я считаю, что инициализация категорий здесь ужасна и похожа на запах кода. Что если у вас есть несколько свойств, которые необходимо заполнить из базы данных? Что если у вас было более одного действия, в котором в качестве аргумента использовалась DocumentViewModel? Вам придется повторять этот уродливый шаг снова и снова. Лучший подход - заполнить все свойства модели, используя связыватель модели, и передать ее в контроллер. Таким образом, объект, который передается контроллеру, находится в «согласованном» состоянии.