>백엔드 개발 >C++ >생성자 주입과 싱글톤 또는 Unity의 인수 전달: 어떤 종속성 주입 접근 방식이 가장 좋습니까?

생성자 주입과 싱글톤 또는 Unity의 인수 전달: 어떤 종속성 주입 접근 방식이 가장 좋습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-27 22:13:10635검색

Constructor Injection vs. Singleton or Argument Passing in Unity: Which Dependency Injection Approach is Best?

Unity의 종속성 주입: 생성자 주입과 싱글톤 또는 인수 전달

Unity와 같은 종속성 주입 프레임워크를 활용할 때 중요한 고려 사항이 발생합니다. 애플리케이션의 더 깊은 계층 내에서 종속성을 해결하는 방법에 대해 설명합니다.

제시된 시나리오에서 TestSuiteParser 클래스에는 TestSuite 및 TestCase 인스턴스에 대한 액세스가 필요합니다. 이 문제를 해결하기 위해 다음과 같은 몇 가지 접근 방식을 모색합니다.

싱글톤 Unity 컨테이너

Unity 컨테이너를 저장하기 위한 싱글톤을 생성하면 코드베이스의 어디에서나 컨테이너에 액세스할 수 있습니다. 그러나 이 접근 방식은 컨테이너 자체에 대한 종속성을 도입하므로 이상적이지 않습니다.

Unity 컨테이너를 인수로 전달

Unity 컨테이너를 모든 개체에 인수로 전달 종속성이 필요한 클래스는 번거롭고 시각적으로 불쾌할 수 있습니다.

생성자 주입

의존성 주입에 선호되는 솔루션은 생성자 주입입니다. 이 패턴에서는 아래 TestSuiteParser 클래스에 설명된 것처럼 종속성이 클래스 생성자의 매개 변수로 선언됩니다.

public class TestSuiteParser
{
    private readonly TestSuite _testSuite;
    private readonly TestCase _testCase;

    public TestSuiteParser(TestSuite testSuite, TestCase testCase)
    {
        _testSuite = testSuite ?? throw new ArgumentNullException(nameof(testSuite));
        _testCase = testCase ?? throw new ArgumentNullException(nameof(testCase));
    }

    // ...
}

생성자 주입을 사용하면 클래스의 인스턴스가 다음과 같을 때 컨테이너에 의해 종속성이 자동으로 해결됩니다. 생성되었습니다. 이 접근 방식은 클래스가 인스턴스화 시 사용 가능한 필수 종속성을 갖도록 보장합니다.

컴포지션 루트에서 Unity 컨테이너는 다음과 같이 구성될 수 있습니다.

container.RegisterType<TestSuite, ConcreteTestSuite>();
container.RegisterType<TestCase, ConcreteTestCase>();
container.RegisterType<TestSuiteParser>();

var parser = container.Resolve<TestSuiteParser>();

컨테이너가 TestSuiteParser 인스턴스를 확인할 때 , TestSuite 및 TestCase를 자동으로 주입합니다. dependency.

결론

생성자 주입은 싱글톤 또는 인수 전달 접근 방식의 단점을 제거하여 단일체로 종속성을 해결하는 깔끔하고 효율적인 방법을 제공합니다. 이 접근 방식은 느슨한 결합을 촉진하고 애플리케이션의 테스트 가능성을 향상시킵니다.

위 내용은 생성자 주입과 싱글톤 또는 Unity의 인수 전달: 어떤 종속성 주입 접근 방식이 가장 좋습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.