2012-04-16 20 views
0

當我想我可以用這個錯誤,沒有太多的多個內核上的Ninject變種,但我試圖用Ninject和SolrNet。同時充分利用完全鬆散的映射。所以我知道我需要使用Ninject命名的綁定。不能使用溫莎,它的dll似乎不適合我們目前的東西。ActivationException使用Ninject訪問多個內核在SolrNet

可疑代碼:

SolrServers cores = new SolrServers(); 

cores.Add(new SolrServerElement 
{ 
    Id = "index1", 
    DocumentType = typeof(ISolrOperations<Dictionary<string, object>>).AssemblyQualifiedName, 
    Url = "http://localhost:8080/solr/index1", 
}); 

cores.Add(new SolrServerElement 
{ 
    Id = "index2", 
    DocumentType = typeof(ISolrOperations<Dictionary<string, object>>).AssemblyQualifiedName, 
    Url = "http://localhost:8080/solr/index2", 
}); 

var kernal = new StandardKernel(new SolrNetModule(cores)); 
var operations = kernal.Get<ISolrOperations<Dictionary<string, object>>>("index1"); 

錯誤出品:

Test 'Test.DifferentTest' failed: 
Ninject.ActivationException : Error activating ISolrOperations{Dictionary{string, Object}} 
No matching bindings are available, and the type is not self-bindable. 
Activation path: 
    1) Request for ISolrOperations{Dictionary{string, Object}} 

我明白了DI的概念,但是我不知道遠不止這些,因爲在MVC中的一切似乎與我隱瞞。因此,任何額外的解釋,爲什麼這是愚蠢的/如何SolrNet與它交互,將不勝感激。

鏈接SolrNet模塊https://github.com/mausch/SolrNet/blob/master/Ninject.Integration.SolrNet/SolrNetModule.cs

+0

請添加SolrNetModule實現的問題 – 2012-04-16 22:10:20

回答

0

由於我看到您正在使用SolrNet的完全鬆散的映射功能,因此您可以實施以下動態映射作爲解決方法,直到將相同類型/類的支持添加到SolrNet for Ninject。

public class Index1Item 
{ 
    SolrField["*"] 
    public IDictionary<string, object> Fields { get; set; } 
} 

public class Index2Item 
{ 
    SolrField["*"] 
    public IDictionary<string, object> Fields { get; set; } 
} 

請參閱SolrNet項目頁面上Mappings對這個動態映射的更多細節。

然後你SolrNet設置會更改爲以下:

SolrServers cores = new SolrServers(); 

cores.Add(new SolrServerElement 
{ 
    Id = "index1", 
    DocumentType = typeof(Index1Item).AssemblyQualifiedName, 
    Url = "http://localhost:8080/solr/index1", 
}); 

cores.Add(new SolrServerElement 
{ 
    Id = "index2", 
    DocumentType = typeof(Index2Item).AssemblyQualifiedName, 
    Url = "http://localhost:8080/solr/index2", 
}); 

var kernal = new StandardKernel(new SolrNetModule(cores)); 
var operations = kernal.Get<ISolrOperations<Index1Item>>("index1"); 

希望這將有助於...

+0

謝謝,這有助於很多。 – 2012-04-17 15:47:54

0

我還沒有使用Solr的,但我從GitHub上找到的模塊我說你必須分配泛型類型參數的文件類型,而不是ISolrOperations的

+0

的SolrNet模塊是SolrNet庫的一部分,我可以發佈他們的源代碼,我猜。我同意你的建議更新,現在我越來越:'錯誤激活ISolrBasicOperations {{字典字符串,對象}} 不止一個匹配綁定available.' – 2012-04-17 13:18:17

+0

我添加了一個鏈接到SolrNetModule,在計算器上沒有文件上傳。 – 2012-04-17 13:22:35

+1

這是此綁定的正確方法。但是,如果您查看https://github.com/mausch/SolrNet/blob/master/Ninject.Integration.SolrNet.Tests/MultiCoreTests.cs中的最後一個測試用例,您會看到這種情況下綁定了相同的類/鍵入到多個核心尚不支持。 – 2012-04-17 13:37:28

0

SolrNet已經被更新,以支持同一個DocumentType的多個內核名爲綁定所以你可疑代碼現在應該可以工作。

+0

感謝您的支持,但我發現了另一個問題。當我得到結果時,映射似乎被搞砸了。我收到一個帶有正確結果計數的「SolrQueryResults >'對象,但字典中沒有條目。我用小提琴來仔細檢查我是否真的從服務器獲得結果。我錯過了什麼嗎?如果你願意,我可以用代碼在stackoverflow上創建另一個條目。 – 2012-05-02 18:25:36

+0

對不起,遲到的迴應。如果你還沒有解決它。我只是意識到你應該仍然可以使用建議的IndexItem對象方法。由於現在支持相同文檔類型的多核,因此您不需要兩個不同的對象(Index1Item,Index2Item)。 – 2012-05-30 18:06:09