Что такое Dependency Injection (внедрение зависимостей) на языке C#? Как это работает, типы внедрения зависимостей в C# и многое другое.
В недавнем сообщении в блоге мы говорили о том, что язык C# в частности и виртуальная машина .NET в целом являются технологиями высокого уровня. Если вы планируете писать код на C#, внедрение зависимостей - это лишь одна из многих вещей, о которых вы должны знать. Продолжайте читать пример внедрения зависимостей C#, чтобы вы могли использовать его в своих интересах в своем следующем проекте.
Определение Dependency Injection в C#
Если вы более подробно рассмотрите Dependency Injection (DI), то увидите, что это паттерн проектирования программного обеспечения, который позволяет разрабатывать слабосвязанный код. Через DI вы можете уменьшить «жесткость» связи между программными компонентами. Внедрение зависимостей также известно как Inversion-of-Control (инверсия управления), которая упрощает модульное тестирование.
Крайне важно сделать шаг назад к основам проектирования объектно-ориентированного приложения, где основным аспектом проектирования является «слабая связь». Это означает, что объекты имеют только столько зависимостей, сколько необходимо для выполнения своих заданий, а число зависимостей должно быть ограничено.
Кроме того, зависимости объекта должны быть от интерфейсов, а не от конкретных объектов. Что такое конкретный объект? Это любой объект, созданный с помощью ключевого слова «new». Благодаря «слабому связыванию» вы упрощаете поддержку программного продукта и даёте большую возможность повторного использования. Кроме того, вы можете использовать так называемые Mock-объекты, предназначенные для замены дорогостоящих сервисов, таких как socket-communicator.
Существует три типа DI:
1) Constructor Injection
2) Setter Injection
3) Method Injection
Поскольку DI используется для упрощения сопровождения кода, он использует паттерн с объектом-конструктором для инициализации объектов и предоставления необходимых зависимостей объекту. Как вы можете видеть, теперь вы можете «внедрить» зависимость снаружи класса.
Как работает Dependency Injection в C#
Чтобы проиллюстрировать, что вашему классу Client необходимо использовать компонент класса Service, лучшего всего, чтобы ваш клиентский класс «знал» об интерфейсе IService вместо класса Service. Благодаря этому вы можете изменить реализацию класса Service столько раз, сколько хотите, не нарушая хост-кода.
Полезно понимать Принцип Инверсии Зависимостей (Dependency Inversion Principle), который помогает нам при написании слабо связанных классов. Определение:
- Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Как вы внедряете зависимость между двумя модулями? Через инверсию управления. Это фактический механизм, который вы можете использовать для создания модулей более высокого уровня, зависящих от абстракций. Вы должны инвертировать элемент управления, чтобы следовать принципу инверсии зависимостей. В результате ваши высокоуровневые модули больше не зависят от конкретных низкоуровневых реализаций.
Відео курси за схожою тематикою:
Давайте немного погрузимся в три типа Dependency Injection:
Constructor Injection
Основная предпосылка здесь заключается в том, что объект не имеет значений по умолчанию или одного конструктора. Для создания объекта необходимо задать определенные значения во время создания. Вкратце, Constructor Injection использует параметры для внедрения зависимостей. Это самый распространенный вид DI, который выполняется путем предоставления зависимости через конструктор класса при создании экземпляра этого класса.
Кроме того, внедряемый компонент можно использовать в любом месте внутри класса. Хотя он должен использоваться, когда сия зависимость действительно необходима для работы класса. К тому же Constructor Injection используется в наиболее распространенном сценарии, когда классу требуется одна или несколько зависимостей. Вот несколько преимуществ Constructor Injection:
• Инициирует контракт сильной зависимости.
• Он поддерживает тестирование.
• Можно сделать неизменным.
Setter Injection
Его также называют Property Injection (внедрение свойств). Setter Injection позволяет нам создавать затратные ресурсы и сервисы только по мере необходимости и как можно позже. Кроме того, он не требует предварительной проводки всего графика зависимостей. Единственная проблема - трудно определить, какие зависимости требуются. Хотя это не требует добавления или изменения конструкторов. К тому же перед использованием вам нужно будет проверить значение null.
Method Injection
Это наименее распространённый патерн, он используется только в крайних случаях. Как указано в названии, Method Injection вводит зависимость в метод, который будет ее использовать. В результате это удобно, когда для всего класса нужен только один метод, а не зависимость.
Преимущества Dependency Injection C#
С помощью DI вы можете вводить дополнительный код между зависимостями. Чтобы проиллюстрировать это, вы можете использовать Constructor Injection, чтобы предоставить объекту его зависимости. Если у вас есть класс с 10 методами, которые не имеют зависимостей, но вы хотите добавить новый метод с зависимостью, вы можете изменить конструктор для использования Constructor Injection.
Безкоштовні вебінари за схожою тематикою:
С другой стороны, вы можете просто добавить новый конструктор, который будет принимает зависимость. Тем не менее если зависимость нежелательна, вы можете использовать Setter Injection, поскольку она позволяет создавать дорогостоящие ресурсы только тогда, когда это необходимо. Как вы можете видеть, DI делает код надежным, поддерживаемым, многоразовым и читаемым.
Статті за схожою тематикою