Я нахожусь в центре рефакторинга проекта, над которым я работаю. В моих существующих контроллерах я использую шаблон репозитория, но я все еще выполнял слишком много строительных лесов, чем мне было удобно. Это и некоторые из моих контроллеров могли иметь 10+ репозиториев, переданных (через Ninject). Итак, я решил ввести сервисный уровень, где мое намерение состоит в том, чтобы иметь одну услугу на одного контроллера, и каждая служба будет вместо этого иметь несколько репозиториев, введенных в нее, и выполнять необходимую мне работу. Пока это отлично работает, но я сталкиваюсь с путаницей: как перенести проверку модели с контроллера и на уровень обслуживания?Как правильно отделить проверку модели от контроллера в службе?
Например, посмотрите этот Edit
метод на моем OfficesController
:
[HttpPost]
public async Task<RedirectToRouteResult> Edit(
short id,
FormCollection form,
[Bind(Prefix = "Office.Coordinates", Include = "Latitude,Longitude")] Coordinate[] coordinates) {
if (id > 0) {
Office office = await this.OfficesService.GetOfficeAsync(id);
if ((office != null)
&& base.TryUpdateModel(office, "Office", new string[2] {
"Name",
"RegionId"
}, form)
&& base.ModelState.IsValid) {
this.OfficesService.UpdateOfficeAsync(office, coordinates);
}
return base.RedirectToAction("Edit", new {
id = id
});
}
return base.RedirectToAction("Default");
}
Проблема с этим, по сравнению с методами управления является то, что я до сих пор захватить Office
объект из базы данных, выполните обновить, подтвердить его, а затем сохранить его снова. В этом случае сложность возрастала, а не уменьшалась. Раньше я вызывал репозиторий в методе, теперь я вызываю службу, которая вызывает репозиторий для выполнения той же функции. До сих пор это увеличение сложности показало себя только в моих методах Edit
, везде сложность значительно уменьшилась, и это то, что я хочу.
Итак, что было бы правильным способом проверки валидации, и теперь, когда я думаю об этом, логика обновления модели из контроллера и в службу? Рекомендации приветствуются!
Для справки, вот как структурирован мой проект:
- данных: Содержит все мои модели классов
- Data.Google.Maps: Содержит все классы мне нужна десериализация конкретного Kml
- Data.Models: Содержит мои DbContext, конфигурацию, модели вида и частичные модели вида
- Data.Repositories: Содержит все мои репозитории, которые общаются с DbContext. Поскольку EF является псевдорепозитором, он использует мои «репозитории» как более конкретный способ запроса данных. Пример:
FindTechnicians()
илиFindActive()
и т. Д. - Данные. Службы: Содержит все услуги, которые я буду использовать. Сервисы будут иметь один или несколько репозиториев, введенных в них, и выполнить всю логику, которую мне нужно сделать, прежде чем передать завершенную модель представления обратно в контроллер.
- Идентификатор: Содержит мою реализацию ASP.NET Identity.
- Web.Private: Содержит проект MVC.
Какое количество зависимостей репозитория зависит от ваших услуг? Вы просто переместили проблему чрезмерной инъекции зависимостей или решили ее решить? – danludwig
Я просто переместил его на сервисный уровень, потому что я знаю, что мне нужно будет сделать несколько более сложных вещей с результатами некоторых репозиториев и * затем * передать завершенную модель в контроллер. – Gup3rSuR4c