最後に、私は実際の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登録:
For<IndexReaderProxy>().Singleton().Use(
new IndexReaderProxy(FSDirectory.Open(new DirectoryInfo(LuceneIndexPath)), true)
);
私はcasperOneに同意します。インターフェイス/ファサードの背後にあるインスタンスを隠すことで、オブジェクトプーリングなどの戦略をより簡単に実装できるようになります。 – Steven
私はこれを考慮しましたが、IoCコンテナからオブジェクトの作成と生涯管理のためにresposibiliyを削除することは残念です。間違いなくIoC中心のものを考え出すことができなければ、間違いなく私にとってはうまくいくでしょう。 –