기술나눔

C# IOC 컨테이너, 종속성 주입 및 제어 반전

2024-07-12

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

제어 반전(IoC)

정의 : 제어 역전은 기존 프로그래밍의 제어 흐름을 역전시키는 설계 원칙입니다. 기존 프로그래밍 모델에서는 구성 요소 간의 종속성이 구성 요소 자체에 의해 내부적으로 생성되고 유지됩니다. 제어 반전 모드에서 이 종속성은 외부 컨테이너(예: Spring 프레임워크, .NET의 Microsoft.Extensions.DependencyInjection 등)에 의해 관리됩니다. 구성 요소는 더 이상 자체 종속성을 담당하지 않지만 모든 종속성을 주입합니다. 외부 컨테이너를 통해 필수 종속성을 사용합니다.

주요 아이디어: 객체 생성과 객체 간의 종속성 관리를 객체 자체에서 외부 컨테이너로 이동합니다.

이점

  • 결합 감소: 구성 요소 간의 종속성은 더 이상 하드 코딩되지 않으므로 구성 요소 구현을 보다 쉽게 ​​교체할 수 있어 시스템 유연성과 유지 관리성이 향상됩니다.
  • 모듈성 향상: 개별 구성 요소는 특정 구현에 의존하지 않고 추상 인터페이스나 추상 클래스에 의존하기 때문에 독립적으로 개발하고 테스트할 수 있습니다.
  • 테스트하기 쉬움: 구성 요소 간의 종속성은 외부화되므로 모의 개체나 테스트 스텁을 사용하여 단위 테스트에 대한 종속성을 시뮬레이션하는 것이 더 쉽습니다.

의존성 주입(DI)

정의 : 종속성 주입은 제어 반전을 달성하는 구체적인 방법입니다. 종속성(서비스 또는 개체)을 클래스에서 직접 생성하도록 하는 대신 클래스에 전달하는 작업이 포함됩니다.

실현 방법

  • 생성자 주입 : 클래스 생성자를 통해 종속성이 제공됩니다. 이는 C#에서 가장 일반적이고 권장되는 DI 형식입니다.
  • 속성 주입 : 클래스의 공용 속성을 통해 종속성을 할당합니다. 이 접근 방식은 유연성을 제공하지만 내부 상태를 노출하고 캡슐화를 줄일 수 있습니다.
  • 메소드 주입 : 메서드 매개변수를 통해 종속성을 전달합니다. 특정 메서드에 필요한 종속성만 주입하는 데 적합합니다.

IOC 컨테이너

정의 :IOC 컨테이너는 객체 수명주기 및 종속성을 관리하기 위한 프레임워크입니다. 구성(예: XML 파일, 주석 또는 코드 구성)을 기반으로 객체를 자동으로 생성하고 이러한 객체에 종속성을 주입합니다.

효과

  • 객체 생성: 구성에 따라 객체 인스턴스를 자동으로 생성합니다.
  • 의존성 주입: 제어 반전을 달성하기 위해 객체에 종속성을 주입합니다.
  • 수명주기 관리: 자원의 생성, 파괴, 재활용 등 객체의 생애주기를 관리합니다.

IOC 컨테이너를 사용하여 종속성 관리

C#에서는 다양한 IOC 컨테이너를 사용하여 Microsoft.Extensions.DependencyInjection(.NET Core 이상 버전의 기본 제공 DI 컨테이너), Autofac 등과 같은 종속성을 관리할 수 있습니다. 다음은 IOC 컨테이너를 사용하여 C# 프로젝트에서 종속성을 관리하는 방법을 소개하는 예로 Microsoft.Extensions.DependencyInjection을 사용합니다.

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 친절한).이런 식으로, 언제MyControllerIOC 컨테이너가 생성되면 자동으로IMyService구현은 생성자에 주입됩니다.

지침
  • 인터페이스 기반 추상화 사용: 유연성과 테스트 가능성을 높이기 위해 종속 유형에 대한 인터페이스 또는 추상 클래스를 선호합니다.
  • 싱글톤의 남용을 피하세요: 싱글톤 서비스는 상태 관련 문제를 피하기 위해 주의해서 사용해야 합니다.
  • 객체 수명주기 모니터링: 종속성(싱글톤, 범위, 임시)의 수명주기를 이해하여 리소스 사용량을 효과적으로 관리합니다.