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
    }
}

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

1 ответ

Решение

В моем случае проблема заключалась в том, что мой 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>>();
    }
}
Другие вопросы по тегам