2015-12-28 2 views
1

Есть ли способ определить соединение с новым ядром Solr «на лету» на основе динамических данных?Подключение к нескольким ядрам во время выполнения

У нас есть сценарий, в котором наша установка Solr имеет несколько ядер/индексов для одного и того же типа документов, разделенных по дате (поэтому документы данной недели будут указаны в индексе 1, на предыдущей неделе по индексу 2 и т. Д.).

Поэтому, когда я получаю свой запрос, я проверяю, требуется ли заданный диапазон дат, и на его основе я хочу запросить конкретное ядро. Я не знаю заранее, при запуске, какие ядра я буду иметь, поскольку новые могут быть созданы динамически во время выполнения.

Используя встроенный провайдер ServiceLocation, невозможно связать два разных ядра с одним и тем же классом документов. Но даже если я использую другой контейнер DI (в настоящее время Autofac в моем случае), мне все равно нужно указать все основные URL-адреса заранее, во время регистрации компонента.

Есть ли способ обойти его, кроме как всегда создавать новый контейнер Autofac, генерируя класс ISolrOperation <> и освобождая его до следующего раза, когда мне нужно подключиться к ядру?

+1

https://groups.google.com/d/msg/solrnet/N0tj_ILL1Gw/4D7Rvr7jAgAJ –

ответ

1

Mauricio Scheffer (разработчик Solr.Net)'s comment подтвердил, что нет встроенной поддержки для подключения к различным URL-адресам индекса «на лету». Поэтому вместо того, чтобы инстанцировании внутренние объекты самостоятельно, я использовал хак на вершине моего существующего Autofac на основе DI контейнера:

public ISolrOperations<TDocument> ConnectToIndex<TDocument>(string indexUrl) 
{ 
    // Create a new AutoFac container environment. 
    ContainerBuilder builder = new ContainerBuilder(); 

    // Autofac-for-Solr.Net config element. 
    var cores = new SolrServers 
    { 
     new SolrServerElement 
     { 
      Id = indexUrl, 
      DocumentType = typeof (TDocument).AssemblyQualifiedName, 
      Url = indexUrl, 
     } 
    }; 

    // Create the Autofac container. 
    builder.RegisterModule(new SolrNetModule(cores)); 
    var container = builder.Build(); 

    // Resolve the SolrNet object for the URL.  
    return container.Resolve<ISolrOperations<TDocument>>(); 
} 
Смежные вопросы