在SolrNet中使用Ninject访问多个Core时的ActivationException

时间:2012-04-16 19:51:51

标签: ninject solrnet

我想我可能会使用这个错误,Ninject的多核心变体并没有多少,但我正在尝试使用Ninject和SolrNet。同时利用完全松散的映射。所以我知道我需要使用Ninject命名绑定。不能使用温莎,它似乎不能很好地适应我们目前的东西。

怀疑代码:

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

3 个答案:

答案 0 :(得分:0)

我还没有使用Solr,但是从我在github上找到的模块中我会说你必须将泛型类型参数分配给文档类型而不是ISolrOperations

答案 1 :(得分: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");

希望这会有所帮助......

答案 2 :(得分:0)

SolrNet已经更新,以支持具有命名绑定的同一DocumentType的多个核心,因此您的可疑代码现在可以正常工作。