Я прочитал пару книг и статей о MVC и наткнулся на шаблон репозитория и уровень сервисов.
Должен ли контроллер иметь возможность получать объекты через шаблон репозитория или он должен извлекать данные из уровня служб?
Изменить: у меня есть код на уровне сервисов, который выглядит так
public UserInfo GetModel(int userInfoID)
{
return userInfoRepo.Get(userInfoID);
}
public UserInfo GetUserByPortalID(string portalID)
{
return userInfoRepo.GetByPortalID(portalID);
}
public UserInfo GetModelByUserName(string username)
{
return userInfoRepo.GetByUserName(username);
}
Если метод в службе вызывает только другой метод в репозитории, необходимо ли, чтобы контроллер проходил через службу?
Ответ 1 · рейтинг 11 · Mark Seemann
В многоуровневой архитектуре приложений существует фундаментальное правило, согласно которому вы никогда не должны обходить уровень. Если вы запросите свой репозиторий прямо с вашего контроллера, вы нарушите это правило.
Ну и что? спросите вы. Что, если сервисный уровень ничего не добавляет? Возможно, в будущем...
Вы можете нарушить это правило, но тогда это больше не будет многоуровневым приложением. Это тоже может быть нормально - есть другие хорошие (даже лучшие) архитектуры приложений, но я думаю, что сначала вы должны принять решение относительно общей архитектуры, а затем придерживаться этого решения. В противном случае вы получите спагетти-код - мы называем это лазаньей, когда это многоуровневое приложение :)
Ответ 2 · рейтинг 4 · Carles Company
Это зависит. Если вы планируете в будущем иметь сложные бизнес-правила, я бы добавил сервисный уровень. Если ваш сайт выполняет только операции CRUD с небольшой логикой или без нее на уровне сервиса, вы можете напрямую вызвать уровень репозитория.
Ответ 3 · рейтинг 2 · Darin Dimitrov
Должен ли контроллер получать объекты через шаблон репозитория или он должен извлекать данные из уровня служб.
В идеале контроллер должен использовать только сервисный уровень, который сам зависит от одного или нескольких репозиториев, чтобы объединить одну или несколько простых операций CRUD в бизнес-операцию. Однако в простых приложениях бывают случаи, когда вам может не понадобиться сервисный уровень, а контроллер напрямую использует репозиторий.
Ответ 4 · рейтинг 2 · Evgenii
Это всегда вопрос, что вам больше подходит и каков ваш стиль. Что касается меня, я предпочитаю доступ к сервисному уровню из действия контроллера. После этого служба получит доступ к модели репозитория.
public class UserController : MyServiceController<UserServices>
{
public ActionResult GetUser(int id)
{
var user = Service.GetUser(id);
return View(user);
}
}
public class UserServices : MyServices<User>
{
public User GetUser(int userId)
{
return Repository.Single(a=>a.Id == userId);
}
}