0

我想我可能用错了,多核的 Ninject 变体没有太多,但我正在尝试使用 Ninject 和 SolrNet。同时利用完全松散的映射。所以我知道我需要使用 Ninject 命名绑定。不能使用 Windsor,它的 dll 似乎与我们当前的东西不兼容。

可疑代码:

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

4

3 回答 3

0

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

于 2012-04-16T22:23:28.103 回答
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项目页面上的映射。

然后您的 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");

希望这会有所帮助...

于 2012-04-17T14:28:04.117 回答
0

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

于 2012-05-02T13:57:01.887 回答