결국 나는 실제 IndexReader를 래핑하고 Reopening을 관리하는 간단한 프록시 객체로갔습니다. 이 요청을 가로 질러이 같은 인스턴스를 사용해야 할 때 나는 그것의 싱글 톤 인스턴스를 제공하기 위해 StructureMap을 사용하고있다. 아래 코드.
이 상황을 처리하기 위해 사용자 지정 StructureMap ILifecycle을 만들려고했지만 멀리 가지 못했습니다. 자세한 내용은 this question을 참조하십시오.
public class IndexReaderProxy
{
private IndexReader _indexReader;
private readonly object _indexReaderLock = new object();
public IndexReaderProxy(Directory directory, bool readOnly)
{
_indexReader = IndexReader.Open(directory, readOnly);
}
public IndexReader GetCurrentIndexReader()
{
ReopenIndexReaderIfNotCurrent();
return _indexReader;
}
private void ReopenIndexReaderIfNotCurrent()
{
if (_indexReader.IsCurrent()) return;
lock (_indexReaderLock)
{
if (_indexReader.IsCurrent()) return;
var newIndexReader = _indexReader.Reopen();
_indexReader.Close();
_indexReader = newIndexReader;
}
}
}
그리고 StructureMap 등록 :
내가 casperOne에 동의
For<IndexReaderProxy>().Singleton().Use(
new IndexReaderProxy(FSDirectory.Open(new DirectoryInfo(LuceneIndexPath)), true)
);
. 인터페이스/외관 뒤에있는 인스턴스를 숨겨 오브젝트 풀링과 같은 전략을보다 쉽게 구현할 수 있다고 생각하십시오. – Steven
필자는 이것을 고려했지만 오브젝트 생성 및 수명 관리를위한 저장소를 IoC 컨테이너에서 제거하는 것은 수치 스럽습니다. 분명히 나를 위해 일하게 될 것이고, 더 많은 IoC 중심을 생각해 내지 않으면 내 폴백 솔루션이 될 것입니다. –