У меня есть несколько многоязычных веб-сайтов, работающих под одним веб-приложением. Каждый «локаль» имеет собственное ядро Solr (с одинаковыми полями во всех локалях). Я использую SolrNet для выполнения моих поисковых запросов.Устранение соединительной муфты IoC на заводе
Для переключения ядер на основе каждого запроса, я регистрации именованный экземпляр из ISolrOperations<SearchResult>
в моем Autofac контейнере для каждого региона (для тех, кто не знаком с 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 Не обязательно именованные экземпляры, но I * do * нужен способ переключения экземпляров того же типа (с тем же аргументом типа). Я был против раввинов, пытаясь переключить конечную точку одного соединения SolrNet, и я не вернусь!По сути, фактический URL-адрес конечной точки вводится в зависимость от зависимости от ISolrOperations, а сама библиотека очень сильно загружается, поэтому не сложно построить каждый запрос за пределами предоставленных модулей DI. –