문제

내 프로젝트 중 하나에 대한 알림 프레임 워크를 구현하고 있습니다. 매우 일반적이기 때문에 사용자는 여러 전송 레이어를 사용할 수 있으므로 하나의 전달 방법 (WCF) 또는 다른 하나 (예 : ActiveMQ)를 사용하는 것에 대해 신경 쓰지 않아도됩니다 (예 : ActiveMQ). 사용자가 액세스 할 수있는 인터페이스는 물론 전달 방법 (WCF 또는 ActiveMQ)과 무관합니다. 그럼에도 불구하고 두 클래스 (소비자 및 생산자)는 싱글 톤을 구현하므로 실제로 기본 생성자 (의미, 매개 변수 없음)를 사용합니다. 내 문제는 사용자가 사용하려는 전달 방법 인 하나의 매개 변수를 갖고 싶다는 것입니다. 그러나 내가 아는 한, 싱글 톤은 기본 생성자 만 사용합니까? 매개 변수와 함께 싱글 톤을 사용하는 점이 없기 때문에 정상입니다. 그래서 여기 내 옵션은 무엇입니까? 싱글 톤을 만들지 않습니까? 전달 방법을 설정하는 메소드를 작성 하시겠습니까?

당신의 도움을 주셔서 대단히 감사합니다,

세바스찬

도움이 되었습니까?

해결책

매개 변수를 생성자로 전달하는 대신 getInstance () 메소드로 전달하는 것을 제외하고는 싱글 톤이 포함 된 매개 변수를 가질 수 있습니다. 재정의 생성자는 물론 진정한 싱글 톤 구현을 위해 개인이어야합니다. 내 예는 Java로 작성되었지만 C#에도 적용됩니다.

예시:

Singleton s = Singleton.getInstance(42);

싱글 톤 코드에서 :

private Singleton() {

}

private Singleton(int num) {
   //set num
}

public getInstance(int num) {
  //singleton code (calls the private non-default constructor if an object 
  //does not already exist) 
}

다른 팁

Spring.net과 같은 의존성 주입 프레임 워크가 있습니다. 싱글 톤 생성자의 구성 파일에서 매개 변수를 효과적으로 전달할 수 있습니다.

스프링 프레임 워크 예제에 링크

싱글 톤에 필요한 두 가지 동작이 있으면 서브 클래스를 원할 수도 있습니다. 그렇게하면 원하는 클래스 행동의 싱글 톤을 부르면 원하는 행동을 얻습니다.

의존성 주입 프레임 워크로 쉽게 수행 할 수 있습니다. 현재 프로젝트에서 비슷한 구성이 있습니다. Mef. 필요한 것은 생성자 주입 옵션을 사용하고 해당 어셈블리와 요청 된 종속성 어셈블리를 카탈로그에 추가하는 것입니다.

또 다른 옵션은 옵션을 취하고 싱글 톤 인스턴스를 구성하는 일부 형식의 초기화 함수를 갖는 것입니다. 첫 번째 액세스에서 구성하는 대신 초기화 호출 중에 구성 할 수 있습니다. 단점은 싱글 톤을 사용하기 전에 (일반적으로 구성 파일을 사용하여 프로그램 시작시) 싱글 톤을 초기화해야한다는 것입니다.

유사하지만 덜 오류가 발생하기 쉬운 옵션은 싱글 톤 게으른 초기화를하고 "기본값"옵션을 제공하는 것입니다. 발신자가 정적 속성을 설정하도록 설정하여 어떤 옵션이 구성되는지 변경하므로 싱글 톤 구조 이전에 설정된 경우 다른 기본값을 얻을 수 있습니다. 그러나 이것은 혼란 스러울 수 있습니다. 다시 한 번 싱글 톤에 액세스하기 전에 속성을 설정해야합니다. 그렇지 않으면 예상치 못한 행동을 얻을 수 있습니다.

나는 원래 질문에 대답하는 것이 늦었다는 것을 알고 있지만, 나는이 문제가 있었고 여기에 내가 어떻게 해결했는지는 다음과 같습니다. 이상적이지는 않지만 효과가있는 것 같습니다. 싱글 톤 인스턴스를 사용하기 전에 호출 해야하는 초기 메소드를 만들었습니다.

public void Init(/*parameters*/)
{
        if (_isInitialized)
        {
            throw new InvalidOperationException("Component is already initialized!");
        }
        //do your work here
}

싱글 톤 인스턴스에 대한 다른 액세스 (속성 Get, Set, Method Call)에는 객체가 초기화되지 않았 음을 알리는 잘못된 작업 예외가 발생합니다.

나는 이것이 내가 필요로하는 일을한다고 생각합니다. 방법이 무엇을하는지 오해의 위험이 없기 때문에 Getinstance (params)보다 혼란 스럽습니다. 단점은 컴파일 타임 오류를 던지지 않지만 초기화가 완료되지 않은 첫 번째 실행은 예외가 발생하므로 충분해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top