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)


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

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

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

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

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

person Carles Company    schedule 13.04.2011

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

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

person Darin Dimitrov    schedule 13.04.2011

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

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