단일 웹 응용 프로그램에서 여러 언어로 된 "웹 사이트"를 운영합니다. 각 "로켈"에는 자체로 구성된 Solr 코어 (모든 로케일에서 동일한 필드가 있음)가 있습니다. 내 검색 쿼리를 수행하기 위해 SolrNet을 사용하고 있습니다. 당 요청으로 코어를 전환하기 위해공장에서 IoC 컨테이너 커플 링 제거
, 나는 SolrNet에 익숙하지 않은 사람들을위한 명명 된 인스턴스 각 로케일 내 Autofac 컨테이너에 ISolrOperations<SearchResult>
의을 (등록하고,이 효과적으로에 대한 라이브러리로 내 진입 점입니다 쿼리 목적).
난 후 그 생성자 서명이 보이는 콘크리트 SolrSearchService
구현로하는 ISearchService
인터페이스를 가지고
public SolrSearchService(ISolrOperations<SearchResult> solr)
, 내 제어기는 소요 (주입) 단순히 ISearchService
대신 ISearchServiceFactory
이 표시됩니다. 내 SolrSearchServiceFactory
은 다음과 같습니다
public class SolrSearchServiceFactory : ISearchServiceFactory
{
private readonly IComponentContext _ctx;
public SolrSearchServiceFactory(IComponentContext ctx)
{
_ctx = ctx;
}
public ISearchService Create(string id)
{
var result = _ctx.ResolveNamed<ISolrOperations<SearchResult>>(id);
return new SolrSearchService(result);
}
}
id
단순히 로케일 식별자입니다. 이것은 서비스/컨트롤러에서 Autofac을 분리하지만 (컨트롤러에서 수행 된 로직을 기반으로) 요청 당 코어를 전환 할 수있는 기능을 유지하기 위해 내가 해낸 최선의 방법입니다.
그러나 저는 공장 자체가 여전히 Autofac에 결합되어 있기 때문에 여전히이 점에 만족하지 않습니다. 이 문제를 해결할 방법이 있습니까 (SolrNet 또는 Autofac 관점에서)?
나는 Autofac의 공장 대리인을 사용했지만,이 인스턴스에는 적용 할 수있는 방법이없는 것 같습니다.
절대적으로 명명 된 인스턴스가 있어야합니까? – DavidN
@DavidN 반드시 명명 된 인스턴스 일 필요는 없지만 동일한 유형의 인스턴스 (동일한 유형의 인수로)를 전환하는 방법이 필요합니다. 나는 단일 SolrNet 연결의 끝점을 전환하려고 시도한 토끼 고정 장치를 끊어 버렸고 돌아 가지 않을 것입니다!본질적으로 실제 엔드 포인트 URL은'ISolrOperations'의 의존성 의존성에 주입되며 라이브러리 자체는 매우 과중한 부트 스트랩을 겪습니다. 따라서 제공된 DI 모듈 외부의 요청마다 쉽게 생성 할 수있는 것은 아닙니다. –