SolrNet具有一个核心和类型的多个连接

本文关键字:连接 类型 具有一 有一个 核心 SolrNet | 更新日期: 2023-09-27 18:35:21

你好,我有一个非常大的问题。我需要获取/创建与单个类型的一个内核的连接并进行任何操作。现在它看起来像:

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

但是当我尝试连接一种类型和一个核心名称时,我Startup.Init<T>(solrConnection)有例外。我知道Startup容器会阻止具有相同TypecoreName的连接,但我总是为此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
    }
}

如何避免这种情况?

SolrNet具有一个核心和类型的多个连接

就我而言,问题是我的 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>>();
    }
}