2013-08-28 2 views
2

안녕하세요 싱글 톤 객체를 반환하는 메서드를 구현하는 데 관심이 있습니다. MSDN에서 찾은 예제를 기반으로 구현을 만들었지 만 구현이 corect인지 확실하지 않습니다.싱글 톤 구현 검사

코드가 잘 실행되지만 동일한 개체 인스턴스인지 확인하는 방법을 모르겠습니다. 두 객체가 같은 인스턴스 경우

public class FileShareAccessFactory : IFileShareAccessFactory 
{ 
    private volatile static IFileShareAccess m_fileShareAccess; 
    private static object m_SyncRoot = new object(); 

    public IFileShareAccess GetFileShareAccessInstance(IContextFactory contextFactory, ILogger logger) 
    { 
     if (m_fileShareAccess == null) 
     { 
      lock (m_SyncRoot) 
      { 
       if (m_fileShareAccess == null) 
       { 
        m_fileShareAccess = new FileShareAccess(contextFactory, logger); 
       } 
      } 
     } 
     return m_fileShareAccess; 
    } 
} 
+2

질문의 오른쪽 패널에서 확인하십시오 –

+2

단위 테스트를 작성하십시오. – Steven

+0

"동일한 객체 인스턴스인지 확인하는 방법"이란 무엇을 의미합니까? – Oscar

답변

6

두 번 확인 된 구현은 계속 진행되므로 예 - 정상 작동합니다. volatile도 필요하지 않습니다. 왜냐하면 동기화 된 이중 검사는 "null 읽기"라는 작은 숫자를 처리하기 때문입니다. 개인적으로, 나는 이 API을 존중하지 않는 것처럼 보일 것입니다. 즉, 특정 컨텍스트 팩토리와 로거를 지정하는 인스턴스에 대해 묻는다면이 실제로 사용되었습니다. 관련 없음 컨텍스트 - 팩토리 및 로거. 솔직히, IoC/DI 컨테이너도 있습니다.이 컨테이너는 단순히 이것을 오프로드 할 수 있습니다.

+0

외부 종속성에 관한 유용한 정보 –

+0

외부 종속성은 항상 동일합니다. – aleczandru

0

사용 object.ReferenceEquals() 확인하기 :

여기 내 코드입니다. 예를 들어

:

[TestMethod] 
    public void TestGetFileShareAccessInstance() 
    { 
     var first = FileShareAccessFactory.GetFileShareAccessInstance(contextFactory, logger); 
     var second = FileShareAccessFactory.GetFileShareAccessInstance(contextFactory, logger); 

     Assert.IsTrue(object.ReferenceEquals(first, second)); 
    } 
+0

편집과 함께, 나는 당신이 지금 무슨 뜻인지 안다; 그러나 이것은 쓰레딩 의존성을 가진 코드를 테스트하는 데는 충분하지 않습니다. 싱글 톤 패턴은 종종 –

+0

@MarcGravell입니다. –

0

지금이 정말 싱글 인 경우, 그들은 또한 싱글해야합니다, 당신의 생성자에서 종속성이 알 수 있습니다. 그렇지 않다면, 이것에 대해 다시 생각하고 싶습니다.

Unity와 같은 종속성 삽입을보고 싶을 수 있습니다. 이 방법으로이 클래스를 ContainerControlledLifetimeManager으로 등록하여 컨텍스트 팩토리, 로거 및이 객체 모두에 싱글 톤을 적용 할 수 있습니다. 나중에 더 많은 컨텍스트 팩토리를 가질 수있는 유연성을 허용하므로 더 많은 수의 FileShareAccessFactory이 필요합니다.

  1. 은 생성자 개인하십시오 : 당신은 당신의 코드를 유지하는 경우 당신이해야합니다

    다른 개선 사항은 하나의 인스턴스를 시행합니다.

  2. 인감 클래스 또는 후손 클래스를 구성 할 수 있습니다.
관련 문제