2011-11-14 3 views
1

큰 의존성의 범위를 관리 :이 같은 약 보이는 싱글로 Ninject에 의해 관리되는 클래스가 Ninject에

class InMemoryDb 
{ 
    IInitialiser _initialiser; 
    SomeBackingStore _store; 

    InMemoryDb(IInitialiser initialiser) 
    { 
     _initialiser = initialiser; 
    } 

    void Init() 
    { 
     //once init'd i don't care what happens to the _initialiser field 
     _store = _initialiser.Initialise(); 
    } 
} 

나는 IInitialiser는 IOC의를 통해 suppied 한을 (실제로는 모든 컨테이너가 관리입니다) . 내 문제는 한 번 initialised, _initialiser 개체가 가비지 수집 절대로 (그리고 왜 그것을 것이라고, Techinically InMemoryDb 싱글 톤 개체에 의해 참조되는 주어진) 및 응용 프로그램 소비 메모리 (그것은 위쪽으로 5gig 있습니다) 앉아. 어떻게하면 코드가 깨끗하게 구조화 되어도 객체가 IOC를 통해 유선으로 연결되고 사용 후 폐기 될 수 있습니다. 본질적으로 그것이 초기화되면, 나는 그 객체를 처분하는 것이 안전하다는 것을 확신 할 수있다. 이 초기화() 메소드 실행이 완료,하지만 내 코드를 검증 할 수 있습니다 한번 범위를 벗어나으로이 결국 GC에 의해 청소 얻을 것이다

void Init() 
{ 
    _store = new Initialiser().Initialise(); 
} 

:

불행하게도, 지금까지에 의존 한 그것에 대해 냄새가 난다.

void Init() 
{ 
    _store = SericeLocator.Get<IInitialiser>().Initialise(); 
} 

을하지만이 ServiceLocator 호출로 내 코드를 polutes로 다시이 좋지 않은 : 나는 또한 일을 생각했다.

구조를 개선하는 방법에 대한 제안 사항이 있으십니까? 그것의 호출자의 책임이다 그런

class InMemoryDb 
{ 
    SomeBackingStore _store; 

    void Init(IInitialiser initialiser) 
    { 
     _store = initialiser.Initialise(); 
    } 
} 

: 그것을 가지고 더 나을 이니셜 라이저가 필요에만 Init 방법입니다 때문에

답변

2

이 방법 대신 생성자 주입을 사용하는 인수로 받아 초기화 메소드를 제공하는 Init 메소드. Init 메서드가 호출되었는지 여부를 나타내는 부울 isInitialized 필드를 사용할 수도 있습니다. 이 필드는 _store 필드에 의존하여 다른 필드가 올바르게 초기화되었는지 확인하는 데 사용됩니다.

+0

감사합니다. 간단한 해결책처럼 들린다. – AaronHS