2016-02-19 4 views
0

Привет, у меня очень большая проблема. Мне нужно взять/создать соединение с одним ядром с одним типом и выполнить любые операции. На данный момент его выглядит следующим образом:SolrNet множественное соединение с одним ядром и типом

public class SolrMachine<T> : ISolrMachine<T> where T : ISolrRecord 
{ 

    private ISolrOperations<T> actuallyInstance { get; set; } 

    public SolrMachine(string coreName) 
    { 
     string url = String.Format("http://xxxx/solr/{0}", coreName); 
     ISolrConnection solrConnection = new SolrConnection(url) { HttpWebRequestFactory = new SolrAuthWebRequestFactory()}; 
     Startup.Init<T>(solrConnection); 
     var myInstance = ServiceLocator.Current.GetInstance<ISolrOperations<T>>(); 
     this.actuallyInstance = myInstance; 
    } 
} 

ISolrMachine<T> представляет собой интерфейс с моими методами работать на ядре Solr. ISolrRecord - это интерфейс со свойствами в моих ядрах.

Теперь, когда я делаю связь с двумя другими ядрами, все работает отлично.

SolrMachine<SolrTypeOne> firstCoreConnection = new SolrMachine<SolrTypeOne>(firstCoreName); 
SolrMachine<SolrTypeTwo> secondCoreConnection = new SolrMachine<SolrTypeTwo>(secondCoreName); 
// operation on firstCoreConnection and secondCoreConnection works 

Но когда я пытаюсь соединиться с одним типом и один coreName у меня есть исключение на Startup.Init<T>(solrConnection). Я знаю, что контейнер Startup блокирует соединение с теми же Type и coreName, но всегда создаю новый экземпляр для этого SolrMachine. Я ожидаю этого:

class SomeClass 
{ 
    public MyMethod() 
    { 
     SolrMachine<SolrTypeOne> myConn = new SolrMachine<SolrTypeOne>(firstCoreName); 
     // operation 
    } 
} 

class SecondSomeClass 
{ 
    public MyMethod() 
    { 
     SolrMachine<SolrTypeOne> myConn2 = new SolrMachine<SolrTypeOne>(firstCoreName); 
     // here it's not work 
    } 
} 

Как этого избежать?

+0

https://github.com/mausch/SolrNet/blob/master/Documentation/Multi-core-instance.md –

+0

Существует ответ для моего случая? :) – Sidron

+0

«Встроенный контейнер в настоящее время ограничен доступом к нескольким ядрам/экземплярам с разными отображаемыми типами». –

ответ

0

В моем случае проблема заключалась в том, что мой Solr использовал IHttpWebRequestFactory. Из многострочной документации SolrNet автор не принимает эту проблему. Вот мое решение (используйте Виндзор):

public class SolrAuth : IHttpWebRequestFactory 
{ 
    public IHttpWebRequest Create(Uri url) 
    { 
     //... credentials, timeouts, etc. 
     return new HttpWebRequestAdapter((HttpWebRequest)webrequest); 
    } 
} 
public class SolrMachine<T> : ISolrMachine<T> where T : ISolrRecord 
{ 
    public WindsorContainer myContainer = new WindsorContainer(); 
    private ISolrOperations<T> actuallyInstance { get; set; } 
    public SolrMachine(string coreName) 
    { 
     var url = string.Format("http://xxx/solr/{0}", coreName); 
     myContainer.Register(Component.For<IHttpWebRequestFactory>().ImplementedBy<SolrAuth>()); 
     var solrFacility = new SolrNetFacility(string.Format("http://xxx/solr/{0}", "defaultCollection")); 
     solrFacility.AddCore(coreName, typeof(T), url); 
     myContainer.AddFacility(solrFacility); 
     this.actuallyInstance = myContainer.Resolve<ISolrOperations<T>>(); 
    } 
}