ASP.NET MVC с уровнем сервиса и уровнем репозитория, где должны быть определены интерфейсы? - программирование
Подтвердить что ты не робот

ASP.NET MVC с уровнем сервиса и уровнем репозитория, где должны быть определены интерфейсы?

Я занимаюсь определением довольно простой многоуровневой архитектуры для приложения .NET MVC с уровнем репозитория и уровнем обслуживания. Я нашел несколько довольно ясных и простых примеров, в частности www.asp.net, и некоторые вопросы и ответы здесь, но я ищу что-то, что немного проще, подходит для небольших приложений, но для разных целей используется разные проекты. В приведенном выше примере яв- ляется репозиторий и служба как классы в пространстве имен Models. Этого просто недостаточно для ясного разделения, чтобы я мог правильно проиллюстрировать его.

У меня есть отдельный проект для репозитория, который реализует интерфейс IRepository. Существует отдельный проект для Сервиса, который реализует IService и принимает IRepository (инъекция конструктора). Служба реализует IService. Для этого примера достаточно, чтобы контроллер создавал экземпляр службы, но пока еще не нужен контейнер IoC. Подумайте об этом как о промежуточном шаге к пониманию лучших архитектурных практик, части последовательности, которая постепенно прогрессирует, чтобы включить инъекцию зависимостей и, возможно, больше слоев.

Вопрос в том, где я должен определить IRepository и IService? Разумеется, как для проектов служб, так и для репозитория. Понятно, что они должны быть определены в другом проекте, на который ссылаются как проекты службы, так и репозитории. Если да, то каково было бы хорошее соглашение об именовании? Что-то вроде XXXXContracts?

Аналогично, для моделей данных, переданных между слоями представления, обслуживания и репозитория, приемлемо ли иметь отдельный проект под названием XXXXModels, на который ссылаются все слои? Я понимаю, что в некоторых случаях модели, передаваемые между уровнем сервиса и репозитория, могут отличаться от тех, которые передаются между уровнем сервиса и уровнем представления, но принцип тот же.

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

4b9b3361

Ответ 1

Введение

Я тоже спросил себя. Один горящий вопрос, который у меня всегда есть, похож на ваш;

каково было бы хорошее соглашение об именах?

Как мне назвать вещи? Должны ли они идти в папки или проекты?

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

Мои герои ASP ASP MVC по этой теме Джеффри Палермо, Стив Смит и Джимми Богард.

Архитектура лука

Джеффри Палермо обсуждает комбинацию старых идей, но объединяет их и дает визуально стимулирующее название Луковая архитектура (рекомендуемое чтение), Джеффри демонстрирует хороший подход к проблеме того, где положить вещи. Он объясняет, что в центре (или сверху) вашего приложения у вас есть Core. Этот слой должен помещать интерфейсы, такие как IRepository и IService.

Почти все ваши интерфейсы должны идти в ядре, а все остальное (другие проекты) может ссылаться на ядро. Таким образом, все знает скелетную структуру приложения, не зная деталей реализации.

Onion Architecture overview

Постарайтесь, чтобы ссылка на слой пользовательского интерфейса была как можно меньше (в пределах разумного). В одном из моих приложений мой уровень UI (MVC) ссылается только на Core. Все, что ему нужно, вводится с помощью Injection of Dependency.

Стив Смит обсуждает архитектуру лука и подобные идеи с демонстрациями в Лучшие решения для MVC: решение проблемы решения

Мое решение

В моих MVC-решениях у меня типичная структура:

  • MyProject.Core
  • MyProject.Domain
  • MyProject.DependencyInjection
  • MyProject.Infrastructure
  • MyProject.Web
  • MyProject.Tests

Ядро содержит мои интерфейсы. Обычно он делится на такие папки, как "Службы", "Модели", "Домен", "Хранилища" и т.д.

Уровень Домен ссылается только на ядро ​​и содержит мою реализацию. Он предоставляет множество конкретных классов для абстракции домена в ядре. Он имеет дело с большой логикой бизнеса, обработкой, обработкой команд, классами менеджеров, реализацией конкретных сервисов и т.д. Я считаю это довольно внутренним слоем и поэтому он ссылается как можно меньше.

Уровень DependencyInjection содержит мой выбранный пакет DI/framework и детали реализации. Я считаю его внешним слоем; аналогично UI или Infrastructure, и поэтому хорошо, если он ссылается на многое. Не обязательно, чтобы этот слой был отдельным проектом, и многие люди скажут вам не делать этого. Это нормально; сделайте то, что работает для сложности вашего проекта. Мне нравится, что мой ДИ является его собственностью. Хорошая вещь об этом заключается в том, что я могу заменить рамки DI другой, и все будет хорошо. Никакие слои не ссылаются на проект DI.

Уровень Инфраструктура содержит информацию о регистрации, отправке по электронной почте и доступе к данным. Он будет содержать мой ORM. Это не бизнес-логика, а не UI. Это железная дорога моего решения, чтобы все было сделано. Он находится на внешнем слое, но он ссылается только на Core.

Уровень Веб - это мой проект MVC и ссылается только на Core.

Сложность и окончательные мысли

Я нашел ответы на подобные вопросы здесь, но они имеют тенденцию включать более сложную архитектуру, чем то, что я здесь изложил.

Это хороший момент. Важно помнить о сложности вашей проблемы. Но не следует сдерживать хорошие методы решения. Мое решение и архитектура лука не обязательно очень сложны и на самом деле не раздувают ваше решение. Они просто держат все в отдельности.

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

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