의존성 주입과 싱글 톤. 그것들은 완전히 다른 개념입니까?


17

동료에게 Singleton을 통한 의존성 주입을 사용하는 것에 대해 들었습니다. 그것들이 서로 대체 될 수있는 두 개의 직교 패턴인지 여전히 알아낼 수 없습니까? 아니면 DI는 Singleton 패턴을 테스트 할 수있는 방법입니까?

다음 코드 스 니펫을 살펴보십시오.

    IMathFace obj = Singleton.Instance;

    SingletonConsumer singConsumer = new SingletonConsumer(obj);

    singConsumer.ConsumerAdd(10,20);

SingletonConsumer유형의 파라미터를 접수한다 IMathFace. 내부적으로 싱글 톤 클래스에 액세스하는 대신 SingletonConsumer호출자가 전달한 싱글 톤 인스턴스를 가져옵니다. 이것은 의존성 주입을 통해 싱글 톤 클래스를 소비하는 좋은 예입니까?


DI가 어떻게 싱글 톤을 대체 할 수 있는지 말해 줄 수 있습니까?

7
싱글 톤은 디자인 패턴입니다. DI / IoC는 기술입니다.
Dave

2
바나나는 기화기를 대체 할 수있는 것보다 DI가 싱글 톤을 대체 할 수 없습니다. 그것들은 완전히 다른 개념입니다.
Dave

내 예가 유효합니다.

1
네,하지만 그것은 (또한 비 - 싱글 마찬가지입니다) 캡슐화의 비용에 올 수는 다음을 참조하십시오 stackoverflow.com/questions/1005473/...

답변:


17

그는 정적 접근 자와 함께 고전적인 Singleton 구현을 사용하는 대신 종속성 주입을 사용하여 서비스의 단일 인스턴스를 주입해야한다고 생각했습니다 MySingleton.Instance.

public class MySingleton
{
    public static MySingleton Instance{get{...}};
}

고전적인 싱글 톤 구현에서는 모든 코드가 해당 서비스가 싱글 톤 인 것에 의존합니다. 당신은 기본적으로 사용할 때마다 코드를 소비하도록 가정을 하드 코딩합니다 MySingleton.Instance.

반면에 DI를 사용하면 서비스 인스턴스가 생성자로 전달되어 저장됩니다. 이 서비스에는 단일 인스턴스 만 있다는 것이 구현 세부 사항입니다. 소비 코드에 다른 인스턴스를 제공하도록 쉽게 변경할 수 있습니다. 이렇게하면 하나의 인스턴스 만 적용하는 대신 단일 인스턴스로 구현되는 클래스 / 인터페이스가 있습니다.

예를 들어 테스트를 위해 모의 서비스 구현을 원하거나 프로그램의 다른 부분에서 해당 서비스의 다른 구성이 필요한 경우에 유용합니다.


4

그래 당신 말이 맞아요. 싱글 톤을 통해 객체에 액세스하는 대신 객체에 대한 참조를 전달하므로 생성자 주입을 사용합니다.

다른 사람들이 지적한 것은 이러한 개념은 관련이 없다는 것입니다. 싱글 톤 인스턴스를 소비하는 것은 주입하려는 객체가 실제로 주입 된 객체의 출처를 신경 쓰지 않으므로 특별하지 않습니다.


3

Singleton 패턴과 DI / IoC가 Singleton의 주입과 교차하는 경우가 있습니다.

대부분의 DI 프레임 워크는 주입 된 객체의 단일 인스턴스를 인스턴스화하도록 구성 할 수 있습니다. 그러한 객체의 인스턴스를 요청하는 모든 소비자 객체는 동일한 단일 인스턴스를 갖습니다. 그 인스턴스는 정의상 싱글 톤입니다. 그것은 개념의 중복에 관한 것입니다.


2

여기서 혼동은 싱글 톤과 싱글턴 인스턴스에 대한 정적 접근 자 / 게이트웨이라는 두 가지 개념이 혼동되었다는 것입니다.

올바르게 식별했듯이 동료는 Singleton.Instance(정적 게이트웨이)를 사용하여 직접 액세스하지 않고 종속성을 주입 할 것을 제안합니다 .

이것이 싱글 톤 패턴과 실제로 관련이없는 이유는 동일한 DI 개념이 단일 객체가 아닌 객체를 인스턴스화하는 데 동일하게 적용되기 때문입니다 new Foo(). 단일 구현인지 여부에 관계없이 종속성이 주입됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.