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

Приветствую моего брата и наставника Тобиаса Стренга
Если вам понравилась эта статья и вы хотите узнать больше о программировании в .Net и Angular, подпишитесь на нас :P

ключ к осмысленному коду — осмысленная архитектура

Прежде всего нам нужно настроить полезную архитектуру кода. Моя предпочтительная схема основана на чистой архитектуре Джейсона Тайора для приложений .Net.

Как уже объясняет Роберт С. Мартинс в «Чистой архитектуре»:
общая система сначала разделяется на несколько более мелких систем/проектов, которые затем формируют четко определенные зависимости и интерфейсы друг с другом. Эти системы можно разбить на отдельные модули, каждый из которых служит определенной цели. Структура такой общей системы основана на модели луковичных слоев, где каждый уровень представляет собой модуль.

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

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

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

Из-за этой формы архитектуры соответствующие внешние слои всегда зависят от внутренних, но внутренние не зависят от внешних слоев. Это позволяет сделать внешние слои взаимозаменяемыми. Неважно, является ли уровень представления веб-интерфейсом или API, логика остается неизменной. Также можно без проблем реализовать другую базу данных.

Этот принцип был впервые объяснен Робертом С. Мартином и по существу описывает, что элементы более высокого уровня не должны зависеть от элементов более низкого уровня. Элемент более высокого порядка в иерархии может знать только интерфейс своих сервисных элементов, но не сам сервисный элемент. Таким образом, изменения на более низком уровне могут влиять на более высокие уровни, но не наоборот. Между высшими и низшими элементами рисуется слой абстракции, который гарантирует, что вызовы отправляются не самому исполняющемуся элементу, а его уровню.

Настройте проекты с помощью CLI:

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

mkdir NameOfYourApplication
cd NameOfYourApplication
dotnet new sln
mkdir src
mkdir test

компакт-диск источник

Домен mkdir
Домен cd
dotnet new classlib
cd..

Приложение mkdir
cd Application
dotnet new classlib
cd..

mkdir Infrastructure
cd Infrastructure
dotnet new classlib
cd..

Презентация mkdir
cd Презентация
новая консоль dotnet
cd..

cd..
cd..

dotnet sln add src/Domain/
dotnet sln add src/Application
dotnet sln add src/Infrastructure
dotnet sln add src/Presentation

Пример базы данных

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

Домен:

Домен содержит все элементы, которые будут вызываться из каждого проекта. Это могут быть классы и методы, которые должны быть общедоступными.

Объект:

Сначала нам нужен пример. Давайте создадим объект Table, содержащий некоторые типичные свойства мебели:

Интерфейс

Инверсия зависимостей основана на использовании интерфейсов. Интерфейс — это своего рода «шаблон» или «правило» того, как должен выглядеть ваш класс. является определением типа, аналогичным классу, за исключением того, что оно представляет собой контракт между объектом и его пользователем. Его нельзя ни создать напрямую как объект, ни определить элементы данных. Итак, интерфейс — это не что иное, как набор объявлений методов и свойств.

В этом примере нам нужен только метод GetDataBase()

Приложение:

Приложение содержит бизнес-логику всей программы. Здесь происходит обработка данных.

Инфраструктура:

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

База данных:

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

Исследователь проекта:

Заключение

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

Пожалуйста, ознакомьтесь с другими моими статьями: