2012-07-25 7 views
3

Lucene을 읽고 있으면 모든 요청에서 동일한 IndexSearcher 인스턴스를 사용하는 것이 좋습니다.Lucene.Net Ninject InSingletonScope()를 사용합니다.

내가 같은 인스턴스는 모든 요청에서 공유되어 있는지 확인 할 InSingletonScope를 사용하여 바인딩 어떤 문제가 있을까

public interface IPatientSearch 
{ 
    void DoSearch(ref SearchDTO _search); 

    //... 
} 

Ninject에 사용하여 주입 검색 클래스가있는 경우?

 Bind<IPatientSearch>().To<PatientSearch>().InSingletonScope(); 

그런 접근 방식을 사용하는 데있어 분명한 함정이 누락 되었습니까?

답변

5

Lucene.NET의 관점에서는 문제가 없습니다. IPatientSearch 구현시 IndexWriter이 생성되고이를 사용한다고 가정하면 문제가 발생하지 않습니다. IndexWriter 클래스는 스레드로부터 안전하므로 Lucene.NET 인덱스에 액세스하는 데 문제가 없습니다.

그러나 IPatientSearch 구현의 다른 모든 부분은이 스레드로부터 안전해야합니다. 이 싱글 톤이 여러 스레드에서 액세스되는 경우 구현에있는 다른 모든 상태는 스레드로부터 안전해야합니다. 클래스가 Lucene.NET에 대한 호출 용 패스 스루 일 뿐이라면 괜찮을 것이지만 다른 상태가있는 경우 해당 상태에 대한 액세스가 동기화되어 있는지 확인해야합니다.

당신은 그 클래스의 하나 인스턴스를 필요로하지 않는 한 의존성 주입의 목적을 위해 싱글, 그리고 (다른 클래스는 일반적으로 인스턴스화 할 수 있습니다 것을 Lucene.NET 주위에 얇은 추상화를 만들고 을 할 수 있습니다).

+0

감사합니다. CasperOne. 구현이 스레드 세이프가되도록했습니다. 나는 2 주 동안 그것을 지금 사용하고 있었고 어떤 문제도 지금까지 나타나지 않았다! –