Bezdepbonusu7Программирование: статьи и ответы

Вопрос

MVC3 Design - шаблон репозитория и уровень сервисов

Автор вопроса: ExtrakunОтветов: 4

Я прочитал пару книг и статей о 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);
}

Если метод в службе вызывает только другой метод в репозитории, необходимо ли, чтобы контроллер проходил через службу?

repositorydesign-patternsservice

Ответы

Ответ 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);
    }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы