一核同类型的SolrNet多连接

SolrNet multiple connection with one core and type

你好,我有一个很大的问题。我需要 take/create 连接到一个单一类型的核心并进行任何操作。 现在它看起来像:

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 容器会阻止与相同 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
    }
}

如何避免这种情况?

在我的例子中,问题是我的 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>>();
    }
}