我在單個Web應用程序下運行多個多語言「網站」。每個「語言環境」都有自己的Solr核心(在所有語言環境中都有相同的字段)。我正在使用SolrNet來執行我的搜索查詢。消除工廠中的IoC容器耦合
爲了切換在每個請求的基礎核心,我註冊命名實例在我的每個區域設置Autofac容器ISolrOperations<SearchResult>
(對於那些不熟悉SolrNet,這實際上是我的入口點爲庫查詢目的)。
然後我有一個ISearchService
接口,一個具體SolrSearchService
實現,它的構造簽名如下所示:
public SolrSearchService(ISolrOperations<SearchResult> solr)
爲了動態切換對每個請求內核,我控制器需要一個(注入) ISearchServiceFactory
而不是簡單的ISearchService
。我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模塊之外的每個請求上構建並不是很容易。 –