2016-02-19 34 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容器會阻止與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 
    } 
} 

如何避免這種情況?

+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>>(); 
    } 
}