Lixoradka
@Lixoradka
.Net разработчик

Как правильнос построить N-Tier/N-Layer архитектуру для ASP.NET проекта?

Здравствуйте. Вот уже долгое время не могу найти кошерный способ построение N-Tier/N-Layer архитектуры.
Из того, что я нашел, необходимо создать Solution в среде Visual Studio, в котором создать не менее 2 проектов типа ClassLibrary (слои DAL и BLL) и один проект ASP.NET (слой Web).

При более подробном изучении узнал, что необходим еще один слой - Domain Transfer Object (DTO).
Итого получилось такая структура:

0) Слой DTO, в котором находятся классы объектов. В них будет происходить маппинг свойств из объектов Entity Framework на слое DAL.
1) Слой DAL. Здесь вся работа с базой. Собственно модель из EntityFramework, и класс репозитория, который служит в качестве обертки над каждой таблицей (Обладает набором свойств для оперирования с таблицами. По одному классу репозитория на каждую из таблиц).
2) Слой BLL. Здесь все бизнес процессы и классы, которые я называю сервисы. К примеру, ProductService, который внутри инициализирует поле типа ProductRepository и вызывает его методы, а результаты метода возвращает выше, в слой Web.
3) Слой Web. Здесь контроллеры, представления и прочее.

Так как хочется сделать слои слабосвязными, пытаюсь применять механизм Dependency Injection. Для этого приходится создавать интерфейсы для классов репозиториев и классов сервисов (IProductRepository и IProductService). На данный момент эти интерфейсы определяю в слое DTO, там же где и объекты-контейнеры.

Подобная структура вполне работоспособна, но хотелось бы сделать все кошерно, красиво и как у профессионалов. Помогите пожалуйста советом, что я делаю неправильно и как это можно исправить/улучшить? Основной вопрос мучает по поводу того, как правильно обращаться к репозиторию слоя DAL из контроллеров в слое Web (целесообразно ли использование сервисов), а также в каком слое правильно определять интерфейсы (интерфейсы сервисов – в BLL, а интерфейсы репозиториев – в DAL)?

Ну или дайте пожалуйста ссылочку, где можно прочитать. Спасибо большое за помощь
  • Вопрос задан
  • 7793 просмотра
Решения вопроса 2
Тема достаточно глубокая, лично я сейчас сам её изучаю. Пока что просто подкину вам нужную ссылку:
blog.byndyu.ru/2014/05/blog-post.html
Почитайте, у Александра там ещё много чего интересного написано по этой теме.
Если говорить конкретно по вашему сообщению, то в целом вы всё описываете правильно. Т.е. у вас может быть слой DAL для доступа к базе данных и получения объектов. При этом DAL не содержит бизнес-логики, он только возвращает объекты. Причём списки объектов желательно возвращать как IEnumerable, а не IQueryable.
Далее, как вы правильно сказали, есть слой бизнес-логики. Опять же, как правильно было замечено, слой бизнес-логики хранит ссылку на интерфейс DAL и обращается к нему для получения объектов. Конкретный DAL задаётся через DI.
Насчёт обращения к DAL из контроллера - я бы рекоммендовал всё-таки обратиться через сервис. Вообще я задавал Александру почти точно такой же вопрос - что если мне требуется просто получить список объектов из DAL. Он дал мне ссылку на эту статью blog.byndyu.ru/2011/08/repository.html Почитайте, там как раз об этом.
По-поводу того, в каких сборках правильнее хранить интерфейсы - я, к сожалению, сам пока точно не знаю, так как не прочитал ещё достаточно литературы.
И в финале скажу, что сам Александр рекоммендует по-возможности использовать не сервисные слои, а CQRS. О том что это - поищите в поисковике. Надеюсь ответ был полезен.
Ответ написан
AlexanderByndyu
@AlexanderByndyu
IT-архитектор, эксперт в Agile&Lean
А про CQRS я сейчас пишу довольно объемную статью, а пока есть видео vimeo.com/90706105 и слайды www.slideshare.net/AlexanderByndyu/cqrs-36278020
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@SZolotov
Asp.net core, MAUI,WPF,Qt, Avalonia
Я бы все таки посоветовал постараться понять в чем отличие многозвенной архитектуры приложений от разбивки кода на слои, а потом уже к написанию кода переходить.
Ответ написан
Ваш ответ на вопрос

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

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