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

Доброе утро! Многим знаком пример Contoso Universuty
Строю свое приложение по типу этого по трехслойной архитектуре ,как вынести сортировку и поиск (ниже код) в отдельный метод в бизнес логики , а в контроллере лишь его вызывать?
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
        {
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
            ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

            if (searchString != null)
            {
                page = 1;
            }
            else
            {
                searchString = currentFilter;
            }

            ViewBag.CurrentFilter = searchString;

            var students = from s in db.Students
                           select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                students = students.Where(s => s.LastName.Contains(searchString)
                                       || s.FirstMidName.Contains(searchString));
            }
            switch (sortOrder)
            {
                case "name_desc":
                    students = students.OrderByDescending(s => s.LastName);
                    break;
                case "Date":
                    students = students.OrderBy(s => s.EnrollmentDate);
                    break;
                case "date_desc":
                    students = students.OrderByDescending(s => s.EnrollmentDate);
                    break;
                default:  // Name ascending 
                    students = students.OrderBy(s => s.LastName);
                    break;
            }

            int pageSize = 3;
            int pageNumber = (page ?? 1);
            return View(students.ToPagedList(pageNumber, pageSize));
        }
  • Вопрос задан
  • 676 просмотров
Решения вопроса 1
Valeriy1991
@Valeriy1991
Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
Добрый день! Формируете слой бизнес-логики, слой доступа к данным. В слое бизнес-логики создаете какой-нибудь "бизнес-сервис" а-ля "ItemsService". В этом классе создаете метод с похожей сигнатурой. И всю основную логику по фильтрации переносите из метода действия контроллера в метод бизнес-сервиса. В контроллере Вы лишь обращаетесь к экземпляру бизнес-сервиса и вызываете нужный метод, который делает всю основную работу. В итоге Вы "сажаете Ваш контроллер на диету" - код в методах действия значительно сокращается, и методы действия после таких операций ничего не будут знать о бизнес-логике. По этой теме также сразу изучаете вопросы: IoC-контейнер (мы с коллегами отдаем предпочтение Autofac) и Dependency Injection.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы