Задать вопрос
Lixoradka
@Lixoradka
.Net разработчик

Как правильно использовать N-Layer архитектуру?

Здравствуйте уважаемое комьюнити!
Раньше меня всегда выручали на тостере, надеюсь, что и сейчас получится решить проблему.

Вводная:
У меня есть программа, которая написана в стиле N-Layer с использованием DTO для транспортировки данных между слоями.
Если подробнее, то есть слой DAL, BLL, UI и отдельный слой DTO, где лежат контейнеры для данных.
В слое DAL находится EF и классы-репозитории. Классы реализуют CRUD операции и всевозможные дополнительные (об этом позже).
Для каждой сущности свой класс-репозиторий (UserRepository, OrderRepository etc...). На уровне выше (BLL), у меня располагаются классы-сервисы. Эти классы разделены по назначению (ImportService, ExportService, MediaService). А на последнем уровне находится UI, который ничего особо не объявляет, кроме ViewModel. UI просто создает экземпляры сервисов и дергает за нужные методы, передавая необходимые параметры. Стоит упомянуть про DTO, в котором определены контейнеры, которые ходят от слоя к слою.
Т.о. когда я получаю в классе репозитория entity объект User, с помощью AutoMapper я его привожу к контейнерному типу и возвращаю в вызвавший метод из сервиса.

Суть проблемы:
Проблемы начинаются, когда мне нужно более детально проработать архитектуру.
Допустим у меня есть сервис, который проверяет пользователей по определенному критерию, а затем проставляет им соответствующий тип. Как это правильно реализовывать? Создавать также по назначению класс-репозиторий и в нем реализовывать все методы для работы сервиса? Или необходимо все методы добавлять в класс UserRepository? (Но это же GOD объект получается). Или нужно создать методы, а-ля "GetValidTypeId", потом получать таким методом идентификатор и инициализировать им все контейнеры, а затем отдавать коллецию на Update классу-репозиторию?
А может стоит писать кучу методов, вот таких например: "SetUserValid", "SetUserInvalid"?

Заключение:
В общем куча подобных вопросов возникает постоянно. День ото дня меня посещает мысль, что я делаю все неправильно и мой подход в корне неправильный. К использованию этой архитектуры пришел сам, так как в одной фирме спрашивали почему я не сделал на основе нее тестовое задание. Основы в интернете откопал, а вот более детально не могу найти. Мне нужна толковая литература или человек, которому я смогу изредка задать пару вопросов, предварительно конструктивно их оформив и проведя минимум пару тройку часов в интернете в поисках.

Заранее спасибо за помощь!
  • Вопрос задан
  • 4745 просмотров
Подписаться 8 Оценить Комментировать
Решения вопроса 1
alex1t
@alex1t
.net developer
На мой взгяд у вас получилось слишком строгое следование принципам N-Layered Architecture и Repositiry Pattern. Всё вроде сделано правильно, но этот подход, по-моему, не покрывает все возможные случаи. С одним из таких вы и столкнулись. Строгое следование CRUD в репозитории не оставляет места для более высокоуровневых операций, поскольку либо их надо решать уровнем выше, но тогда это скажется на быстродействии и несколько усложнит код.

Могу порекомендовать почитать следующее.
По архитектурам:
habrahabr.ru/post/233747 - Луковая архитектура. Часть 1
blog.8thlight.com/uncle-bob/2012/08/13/the-clean-a... - The Clean Architecture
alistair.cockburn.us/Hexagonal+architecture - Hexagonal architecture
• Onion Architecture
jeffreypalermo.com/blog/the-onion-architecture-part-1
jeffreypalermo.com/blog/the-onion-architecture-part-2
jeffreypalermo.com/blog/the-onion-architecture-part-3
jeffreypalermo.com/blog/onion-architecture-part-4-...
blog.8thlight.com/uncle-bob/2011/09/30/Screaming-A...

Про CQRS:
blog.byndyu.ru/2014/07/command-and-query-responsib...
blog.byndyu.ru/2014/05/blog-post.html

Про Repository:
blog.byndyu.ru/2011/01/domain-driven-design-reposi...
blog.byndyu.ru/2011/08/repository.html
lostechies.com/jimmybogard/2012/10/08/favor-query-...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы