2014-02-18 3 views
1

나는 사용자가 명시 적으로 지정하지 않은 앱 설정에 대한 기본값으로 사용되는 일련의 문자열을 캡슐화하는 클래스가 있습니다. 이러한 문자열 이후의존성 주입을 사용할 때 일반적으로 정적 인 클래스를 어떻게 디자인합니까?

class SiteConfigurationConventions : ISiteConfigurationConventions 
{ 
    public String GetConfigurationFileName() 
    { 
     return "SiteConfiguration.xml"; 
    } 
} 

static 클래스 (System.Math을 같은) 더 개념적으로 적합 할 것으로 보인다 나는 현재 관련 되 - 명명 된 인스턴스 방법-이있는 평범한 구식 클래스 물건의 종류를 사용하고

런타임에 변경되지 않으며 필드가 필요하지 않지만 호환 가능한 정적 클래스가 DI와 얼마나 유사한 지 잘 모르겠습니다. 예를 들어 컨테이너에 정적 클래스를 등록 할 수없는 것처럼 보이므로 컨테이너가 다른 객체에서 컨테이너를 확인하도록 생성자에게 반환합니다.

는 지금, 나는 등록

container.RegisterType<ISiteConfiguration, SiteConfiguration>(); 

요청 생성자가 필요한 것을 얻을 수 있도록 :

public SiteGenerator(ISiteConfiguration siteConfiguration) 

내 디자인 옵션이 될 것 같다 :

  • 리팩터링 정적 클래스에 그리고 생성자 주입을 사용하는 것보다 내 소비 클래스에서 직접 concrete 유형을 참조하십시오.
  • 그대로 (클래스 및 인스턴스가 인터페이스로 확인 됨) 정확성을 위해 싱글 톤 수명을 사용하여 등록하십시오.
  • 정체를 숨기기 위해 외관이나 공장을 만들었습니다. 그러나, 어떤 이유로이 옵션은 나를 어리석게 만듭니다.

이 같은 클래스의 개념은 홀수 스태틱이 개념적으로 정확하다고 보입니다. 내가 그것을 인스턴스화 가능한 클래스로 만드는 유일한 이유는 DI를 더 친숙하게 만드는 것입니다. 그 소리는 괜찮은가요? 아니면 정확합니까? 내가 뭔가를 놓친 건가?

모든 변호인에게 감사드립니다. :)

답변

0

OK, 약간의 연구 끝에, 인터넷 검색과 생각, 나는 내 자신의 결론에 도달했다고 생각합니다.

정적 클래스의 사용은 IoC 원리와 느슨한 커플 링이 내 아키텍처에 적용될 확률이 높습니다. static 수식어는 하나의 구현 만 특정 목적에 응답 할 수 있다는 것을 나타내는 방식으로, 일반적으로 DI (느슨한 결합, 프로그래밍 인터페이스, 테스트 가능성 및 이와 관련된 모든 것들)와는 다릅니다.

똑같이 정적 수정자는 컴파일러에게 클래스의 인스턴스 수를 1로 제한하고 동시에 변수에 할당하지 못하도록하려는 것입니다 (즉 new을 사용하지 않음). 운영자). IoC를 사용하려면 라이프 스타일 관리를 컴포지션 루트까지 남겨 두어야하며 FCL 클래스가 아닌 구체적인 클래스를 직접 참조하는 것은 아닙니다. 따라서 정적 클래스는 우리에게별로 목적이 없습니다.

따라서 평범하지 않은 (정적이 아닌) 클래스로두고 컴포지션 루트에 싱글 톤 라이프 스타일을 적용한다고 말합니다. 물론 정적 클래스가 변하지 않을 것이라고 생각하지 않는 한, 테스트에서 위조 할 필요가 없다면 (FCL 클래스와 같은) 안정적인 종속성처럼 취급 할 수 있고 클래스를 소비 할 때 직접 구체적인 클래스를 참조하여 일반 DI 스키마에서 제외합니다.

정적 메서드를 사용하는 타사 클래스에 의존해야하거나 종속성을주기 위해 완전히 정적 인 타사 클래스에 의존해야하는 경우 (따라서 테스트 등을 대신 할 수 있음) 여전히 인터페이스를 만들고 정적 메서드를 호출하여 인스턴스화 할 수있는 어댑터에 의존합니다.

1

대부분의 DI 라이브러리는 단일 인스턴스를 모든 주입에 사용할 수 있도록 지정합니다 (단일 인스턴스를 생성하고 매회 응답으로 제공). 이것은 싱글 톤의 형태이며, 아마 당신의 문제에 잘 맞을 것입니다.

예를 들어, MS 유니티 라이브러리를 사용하여, 당신은 둘 것 :

container.RegisterInstance(new SiteConfiguration()); 

를 내가의 형태가되도록 static 키워드를 고려 내장 된 싱글 구현의 DI 경로가 거의 같은 일을하는 동안,하지만, 컴파일러를 사용하지 않고 세부 사항을 처리합니다.

+0

정적 클래스를 인스턴스화 할 수 없으므로 new 연산자를 사용하는 구문이 제대로 작동하지 않습니다. –

+0

죄송합니다. 명확하지 않았습니다. 클래스를 비 정적으로 설정하고 DI 컨테이너를 사용하여 처리하도록했습니다. –

+0

아, 좋아. 귀하의 게시물은 나에게 훨씬 더 의미가 있습니다. :) 오리지널 오해에 대해 유감스럽게 생각합니다. –

관련 문제