2011-04-19 2 views
0

제 질문은 일반적으로 소프트웨어 아키텍처에 대한 것입니다.구조적으로 단일 개체를 IoC 컨테이너로 대체하십시오.

Google은 Windows 서비스 응용 프로그램을 보유하고 있습니다.

Program.cs는 MainService 클래스의 인스턴스를 만들고 시작합니다.

MainServiceServiceBase을 상속하므로 OnStart(string[] args) 메서드를 구현합니다.

보통, 내 응용 프로그램을 설계 할 때, 나는 OnStart 방법으로 이런 짓을 할 것이다 :

MainSingletonObject.Initialize(); 

초기화가의 app.config에서 구성 데이터를 읽고 필요한 클래스의 인스턴스를 만들 것이다, 개방 WCF 호스트 (있는 경우)

서비스 응용 프로그램을 시작하는 것이 좋습니까? 디자인을 개선하기위한 개인적인 건축 조언은 무엇입니까? IoC 컨테이너에 맞는 곳과 내가 손으로 의존성 주입을하는 경우 왜 필요할까요?

+1

두 가지 문제점이 있습니다. 1) 싱글 톤 안티 패턴을 사용하고 있습니다 (http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never- had-since-1995 /), 2) 아무런 도움이되지 않는다. 소프트웨어 아키텍처는 서로 위에 패턴을 쌓는 것에 관한 것이 아니라 개발, 이해 및 유지하기가 쉬운 방식으로 프로그램을 구성하는 것에 관한 것입니다. 이 중 하나에 기여하지 않는 것은 아키텍처에 자리가 없습니다. 그래서 싱글 톤을 만들거나, 정규 클래스를 사용하거나, 심지어 함수를 만들어서 얻는 것은 무엇입니까? – jalf

+0

나는 깨끗한 코드를 얻는다. var를 호출 할 필요없이 myMainClass = new MainClass(); 및 myMainClass.Start(); 서비스 OnStart 메서드에는 한 줄의 코드 만 있습니다. 단순히 개체를 만들고 메서드를 실행하면 어떤 이점이 있습니까? –

+0

하지만 당신이 맞을 수도 있습니다, 나는 잃고 능력을 생성자에 매개 변수를 전달합니다. OnStart 메서드의 app.config에서 모든 종속성을 읽는 것만으로 문제가있을 경우 서비스 시작에 실패했음을 나타낼 수 있습니다. –

답변

1

:

대신 당신은 서비스 구현에 IOC의 의존성을 피하기 있도록 서비스 클래스 여기 IoC를 통해 해결하는 것 new ServiceClass을 갖는
ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
       { 
        new ServiceClass() 
       }; 
      ServiceBase.Run(ServicesToRun); 

. via injection을 구현해야하는 경우 구현 내부의 새로운 객체를 사용하여 특정 컨테이너의 코드를 보온하는 IoC에 등록 된 ITypeFactory 서비스를 노출하십시오. 일반적으로 용기를 단열하면 IoC에서 우수한 설계를 측정 할 수 있습니다.

0

싱글 톤은 초기화하기 위해 다른 사람에게 의존해서는 안됩니다. 그것은 사용되는 즉시 초기화됩니다.

내가 어떻게 할 것입니다 :
public class MySingleton 
{ 
    private static readonly MySingleton _instance = new MySingleton(); 

    private MySingleton() 
    { 
     // ... read config 
    } 

    public static MySingleton Instance 
    { 
     get { return _instance; } 
    } 
} 

여기 static readonly이이 게으른 부하 있는지 확인합니다. 내가 두세 여기에 서비스 부트 스트랩 단계에서 IOC는 woul

관련 문제