2017-03-27 1 views
0

레퍼런스 데이터 서비스 레이어를 정적 구현으로 변경하려고 시도하고 싱글 톤 패턴을 적용하려고합니다. 이유는, 나는 레퍼런스 서비스가 성능 향상을 위해 정적 일 수 있다고 생각한다. (모두 같은 '인스턴스'를 공유한다 - 제 생각에는?)싱글 톤, 스태틱 및 IoC

나는 계층화 된 애플리케이션을 가지고있다. UI-> 서비스 -> 논리 -> 데이터

그러나 IoC를 사용하며 충돌이 있다고 생각합니다. Unity를 IoC 컨테이너로 사용합니다. 정적 인스턴스와 인스턴스를 처리하는 공용 인스턴스를 추가하여 변환을 시작합니다.

그러나 내 생성자와 무엇을해야할지 모르겠습니다. I (유니티)는 현재

public class ReferenceDataService : IReferenceDataService 
{ 

    private static ReferenceDataService instance; 

    IReferenceDataLogic _refDataLogic; 
    ObjectCache cache = MemoryCache.Default; 

    public ReferenceDataService(IReferenceDataLogic logic) 
    { 
     _refDataLogic = logic; 
    } 

    public static ReferenceDataService Instance { 

     get 
     { 
      if(instance != null) return instance; 
      lock(new object()) 
      { 
       instance = new ReferenceDataService(); 
      } 
      result instance; 
     } 
    } 
} 

... 생성자에 내 참조 데이터 로직 클래스를 주입하지만 그건 내 UI 코드에서, 나는 데이터를 얻을 수 있지만, 말을 할 수 있도록 내가,이 생성자를 제거 할 필요가 있다고 생각 :

var MyReferenceDataList = ReferenceDataService.Instance.GetMyReferenceDataList(type); 

로직 및 데이터 액세스 레이어 클래스도 정적으로 만들어야합니까? 그 말은 내가 이것을 실제로 테스트 할 수는 없다는 것을 의미한다.

+3

이 중 하나를 수행해야합니까? 당신은 원래의 구현을 사용할 수없고 단결로 단일 인스턴스를 생성 할 수 있습니까? – Fran

+0

잘 모르겠습니다. @ 프랑 - 그 부분을 살펴 보겠습니다. – Craig

+0

당신이 나를 여기에서 교육 한 것처럼 보입니다. 내 Unity 컨테이너에서 간단히 이렇게 할 수 있습니다 : myContainer.RegisterType (new ContainerControlledLifetimeManager()); - 그 수업은 싱글 톤으로 취급 될 것입니다. 서비스 계층 클래스, 논리 및 데이터베이스 클래스를 변경해야한다고 생각합니까? – Craig

답변

1

단일 인스턴스를 다시 제공하도록 컨테이너에 알릴 수 있어야합니다. Unity에 익숙하지는 않지만 Castle Windsor를 사용하면 라이프 스타일을 싱글 톤으로 설정하십시오.

container.Register(Classes.FromThisAssembly() 
    .BasedOn(typeof(IProvideWellKnownData)) 
    .WithServiceAllInterfaces() 
    .LifestyleSingleton());