2013-09-30 9 views
6

Ninjectカーネルバインディングはあなたが知っているようにこれです。xmlからのNinject依存関係のバインド

kernel.Bind<IMyService>().To<MyService>(); 

xmlからMyServiceを取得したいとします。このようなWebConfigまたはApp.Config。

<add key="service" value="MyNamespace.MyService"> 

コードでこの文字列を取得できます。しかし、私はそれが

kernel.Bind<IMyService>().To<???>();

それともNinijectがデフォルトとしてこれをサポートすることができますどのように使用することができますか?

答えて

6

非汎用のTo(Type)オーバーロードを使用できます。あなたのApp.configファイルから

取得タイプ:

string service = ConfigurationManager.AppSettings["service"]; 
Type serviceType = AssemblyContainingYourType.GetType(service); 

タイプを使用します

kernel.Bind<IMyService>().To(serviceType); 

はすべて言ったが、Ninjectはあなたがコードでバインディングを設定し、に依存しないことを奨励していることをご理解ください設定ファイル。

+1

あなたのタイプはAssemblyContainingですか? – barteloma

+0

'MyNamespace.MyService'が実装されているアセンブリです。 – YK1

+1

推奨されないのはなぜですか?それはあなたのプロジェクトを再コンパイルする必要がないので、XMLでうまくいくように見えます。 – Marc

3

自分のプロジェクトで自分で使ったことはありませんでしたが、おそらくNinject xml拡張が役立つかもしれません。

https://github.com/ninject/ninject.extensions.xml/wiki

<module name="myXmlConfigurationModule"> 
    <bind service="MyNamespace.IMyService, MyAssembly" 
      to="MyNamespace.MyServiceImplementation, MyAssembly" /> 
    <bind service="MyNamespace.IMyOtherService, MyAssembly" 
      to="MyNamespace.MyOtherServiceImplementation, MyAssembly" /> 
</module> 

ないあなたはApp.configファイルに格納することができれば、しかし確か。

+0

私はこのkernel.Load( "configuration.xml")を使いました。動作しません。 – barteloma

+0

xmlはどのように見えましたか?そして何がエラーでしたか?何がうまくいかなかったのですか? – treze

+0

IMyServiceの起動中にエラーが発生しました。 一致するバインディングがありません。そのタイプは自己バインドできません。 アクティベーションパス:IMyService 提案のための 1)要求: 1)IMyService 2)モジュールで定義された結合した場合、モジュールがカーネルにロードされていることを確認するために結合あなたが定義されていることを確認します。 3)誤って複数のカーネルを作成していないことを確認してください。 4)コンストラクタ引数を使用する場合は、パラメータ名がコンストラクタのパラメータ名と一致することを確認してください。 5)自動モジュール読み込みを使用している場合は、検索パスとフィルタが正しいことを確認してください。 – barteloma

0

最後にソリューションを入手するこのファイルのxmlファイルのディレクトリプロパティの出力を、より新しい場合はコピーするように設定して、自動的に出力ディレクトリにコピーできるようにしてください。 for more

1

Ninjectのカーネルは、この結合のようなものです: -

は、以下のようなXMLを作成します -

<module name="myXmlConfigurationModule"> 
    <bind service="MyNamespace.IMyService, MyAssembly" 
      to="MyNamespace.MyServiceImplementation, MyAssembly" /> 
    <bind service="MyNamespace.IMyOtherService, MyAssembly" 
      to="MyNamespace.MyOtherServiceImplementation, MyAssembly" /> 
</module> 

次にコード: -

using Ninject; 

    enter code here 

    class ABC 
     { 
      public void CallingMethodUsingNinject() 
      { 
       private IKernel kernel= new StandardKernel(); 
       kernel.Load("yourXmlFileName.xml"); 
       bool ismodule = kernel.HasModule("myXmlConfigurationModule");//To Check The module 
       if(ismodule) 
       {   
       IMyService MyServiceImplementation = kernel.Get<IMyService>(); 
       MyServiceImplementation.YourMethod(); 
       } 
      } 
     } 

あなたが原因XMLファイルに問題に直面することができますいくつかのプロパティの設定は、XMLファイルの設定を変更する必要があります。 IMyServiceの起動中にエラーが発生しました。一致するバインディングがありません。型は自己バインドできません。 ソリューション:https://www.packtpub.com/sites/default/files/9781782166207_Chapter_02.pdf

-read:それはより多くの場合は、自動的に

出力ディレクトリにコピーすることができるように、より新しい場合はコピーするために、このxmlファイルの出力 Directoryのプロパティにコピーを設定することを忘れ-Don't