2012-04-16 9 views
0

私はこれを間違って使うことができたと思いますが、複数のコアのNinjectバリアントはあまりありませんでしたが、NinjectとSolrNetを使用しようとしています。完全な緩やかなマッピングを利用します。だから私はNinjectという名前のバインディングを使う必要があることを知っています。ウィンザーを使用することはできません.dllは現在のものとうまくやっていないようです。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モジュールへ

リンクはhttps://github.com/mausch/SolrNet/blob/master/Ninject.Integration.SolrNet/SolrNetModule.cs

+0

質問にSolrNetModuleの実装を追加してください –

答えて

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

ありがとう、これは多くの助けとなりました。 –

0

私はまだSolrのを使用していないが、私はgithubの上で見つかったモジュールから私はあなたがISolrOperationsするのではなく、ドキュメントタイプにジェネリック型引数を割り当てる必要が言うと思います

+0

SolrNetモジュールはSolrNetライブラリの一部ですので、ソースコードを投稿することができます。私はあなたの提案を更新して、今私は次のようになっています: 'エラーISolrBasicOperations {Dictionary {string、Object}} 複数の一致するバインディングを利用できます。 ' –

+0

StackOverflowでファイルをアップロードしないSolrNetModuleへのリンクを追加しました。 –

+1

これは、このバインディングの正しいアプローチです。ただし、https://github.com/mausch/SolrNet/blob/master/Ninject.Integration.SolrNet.Tests/MultiCoreTests.csの最後のテストケースを見ると、同じクラス/コンポーネントをバインドするこのシナリオは、複数コアへのタイプはまだサポートされていません。 –

0

SolrNetは、以来、あなたのように、名前のバインディングと同じのDocumentTypeの複数のコアをサポートするように更新されましたのに役立ちます疑わしいコードは今すぐ動作するはずです。

+0

サポートを追加していただき、ありがとうございます。私が結果を取り戻すと、マッピングはうんざりしているようです。私は 'SolrQueryResults >'オブジェクトを正しい結果カウントで返しますが、辞書には何もありません。私は、実際にサーバから結果を得ていることを二重チェックするために、フィドラーを使用しました。何か不足していますか?もしあなたが望むなら、私はコードでstackoverflowに別のエントリを作ることができます。 –

+0

遅れて申し訳ありません。あなたはまだそれを解決していない場合。私はおそらくあなたはおそらくまだ提案されたIndexItemオブジェクトのアプローチを使用する必要があることに気づいた。同じドキュメントタイプのマルチコアがサポートされているので、2つの異なるオブジェクト(Index1Item、Index2Item)は必要ありません。 –