큰 의존성의 범위를 관리 :이 같은 약 보이는 싱글로 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
방법입니다 때문에
감사합니다. 간단한 해결책처럼 들린다. – AaronHS