Обмен технологиями

C# IOC-контейнер, внедрение зависимостей и инверсия управления

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Инверсия управления (IoC)

определение : Инверсия управления — это принцип проектирования, который меняет поток управления в традиционном программировании. В традиционных моделях программирования зависимости между компонентами создаются и поддерживаются внутри самих компонентов. В режиме инверсии управления эта зависимость управляется внешним контейнером (например, средой Spring, Microsoft.Extensions.DependencyInjection в .NET и т. д.). Компонент больше не отвечает за свои собственные зависимости, а внедряет все зависимости. через внешний контейнер необходимые зависимости.

Основная идея: переносит создание объектов и управление зависимостями между ними из самих объектов во внешние контейнеры.

преимущество

  • Уменьшите сцепление: Зависимости между компонентами больше не жестко запрограммированы, поэтому реализации компонентов можно легче заменять, что повышает гибкость и удобство обслуживания системы.
  • Улучшение модульности: Отдельные компоненты можно разрабатывать и тестировать независимо, поскольку они полагаются не на конкретные реализации, а на абстрактные интерфейсы или абстрактные классы.
  • Легко проверить: поскольку зависимости между компонентами являются внешними, для имитации зависимостей при модульном тестировании проще использовать макеты объектов или тестовые заглушки.

Внедрение зависимостей (DI)

определение : Внедрение зависимостей — это особый способ добиться инверсии управления. Он предполагает передачу зависимостей (сервисов или объектов) в классы вместо того, чтобы позволить классам создавать их самостоятельно.

Метод реализации

  • внедрение конструктора : Зависимости предоставляются через конструктор класса. Это наиболее распространенная и рекомендуемая форма внедрения зависимостей в C#.
  • Внедрение свойств : назначение зависимостей через общедоступные свойства класса. Этот подход обеспечивает гибкость, но может раскрыть внутреннее состояние и уменьшить инкапсуляцию.
  • метод инъекции : передать зависимости через параметры метода. Подходит для внедрения только зависимостей, необходимых для конкретного метода.

контейнер МОК

определение :IOC-контейнер — это платформа для управления жизненным циклом объектов и зависимостями. Он автоматически создает объекты на основе конфигурации (например, файлы XML, аннотации или конфигурацию кода) и вводит зависимости в эти объекты.

эффект

  • Создание объекта: Автоматически создавать экземпляры объектов на основе конфигурации.
  • внедрение зависимости: Внедрение зависимостей в объекты для достижения инверсии управления.
  • управление жизненным циклом: Управляйте жизненным циклом объектов, включая создание, уничтожение и переработку ресурсов.

Используйте контейнеры IOC для управления зависимостями.

В C# для управления зависимостями можно использовать различные IOC-контейнеры, например Microsoft.Extensions.DependencyInjection (встроенный DI-контейнер .NET Core и более поздних версий), Autofac и т. д. Ниже в качестве примера используется Microsoft.Extensions.DependencyInjection, чтобы показать, как использовать контейнеры IOC для управления зависимостями в проектах C#.

Шаг 1. Зарегистрируйтесь для получения услуги

Службы обычно используются в приложениях .NET.Program.csилиStartup.cs(для проектов ASP.NET Core), используемый вIServiceCollectionинтерфейс для регистрации.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>(); // 将MyService注册为单例服务
    // 其他服务注册
}
  • 1
  • 2
  • 3
  • 4
  • 5
Шаг 2. Внедрение зависимостей

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

public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    // ... 控制器的其他代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

В приведенном выше примереMyControllerКласс вводится через конструкторIMyServiceРеализация интерфейса (т.е.MyService добрый).Таким образом, когдаMyControllerПри создании контейнер IOC автоматическиIMyServiceРеализация внедряется в конструктор.

Меры предосторожности
  • Используйте абстракции на основе интерфейса: отдавайте предпочтение интерфейсам или абстрактным классам для зависимых типов, чтобы повысить гибкость и возможность тестирования.
  • Избегайте чрезмерного использования синглтонов: Службы Singleton следует использовать с осторожностью, чтобы избежать проблем, связанных с состоянием.
  • Мониторинг жизненного цикла объекта: Понимание жизненного цикла зависимостей (одиночных, областей действия, временных процессов) для эффективного управления использованием ресурсов.