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

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

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


person Extrakun    schedule 13.04.2011    source источник


Ответы (4)


arrow_upward
11
arrow_downward

В многоуровневой архитектуре приложений существует фундаментальное правило, согласно которому вы никогда не должны обходить уровень. Если вы запросите свой репозиторий прямо с вашего контроллера, вы нарушите это правило.

Ну и что? спросите вы. Что, если сервисный уровень ничего не добавляет? Возможно, в будущем...

Вы можете нарушить это правило, но тогда это больше не будет многоуровневым приложением. Это тоже может быть нормально — есть другие хорошие (даже лучшие) архитектуры приложений, но я думаю, что сначала вы должны принять решение относительно общей архитектуры, а затем придерживаться этого решения. В противном случае вы получите спагетти-код — мы называем это лазаньей, когда это многоуровневое приложение :)

person Mark Seemann    schedule 13.04.2011
comment
Я не уверен, что согласен с вами. Даже если у вас всего два слоя, это все равно многоуровневое приложение. Каково минимальное количество слоев, чтобы оно считалось многоуровневым приложением? - person Carles Company; 09.07.2011
comment
Не количество слоев решает, многослойный он или нет, а то, что вы игнорируете слой, нарушает правило. И да, всего с двумя слоями довольно сложно обойти один из них от другого. - person twDuke; 30.09.2011

arrow_upward
4
arrow_downward

Это зависит. Если вы планируете в будущем иметь сложные бизнес-правила, я бы добавил сервисный уровень. Если ваш сайт выполняет только операции CRUD с небольшой логикой или без нее на уровне сервиса, вы можете напрямую вызвать уровень репозитория.

person Carles Company    schedule 13.04.2011

arrow_upward
2
arrow_downward

Должен ли контроллер получать объекты через шаблон репозитория или он должен извлекать данные из уровня служб.

В идеале контроллер должен использовать только сервисный уровень, который сам зависит от одного или нескольких репозиториев, чтобы объединить одну или несколько простых операций CRUD в бизнес-операцию. Однако в простых приложениях бывают случаи, когда вам может не понадобиться сервисный уровень, а контроллер напрямую использует репозиторий.

person Darin Dimitrov    schedule 13.04.2011

arrow_upward
2
arrow_downward

Это всегда вопрос, что вам больше подходит и каков ваш стиль. Что касается меня, я предпочитаю доступ к сервисному уровню из действия контроллера. После этого служба получит доступ к модели репозитория.

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);
    }
}
person Evgenii    schedule 13.04.2011