2011-07-12 7 views
0

私のWCFサービスでNinjectを使用しようとしています。私はNinject 2.2.1.4とNinject.Extensions.Wcf 2.2.0.4を使用しています。 Ninjectが正常に動作していることを確認するためのユニットテストは、ArgumentNullExceptionで失敗します。パラメータルート:nullここでNinject + WCF Issue

は私のコードです:

//A couple of classes to setup ninject and its bindings 
public class NinjectBindings : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IEmployeeRepository>().To<SqlEmployeeRepository>().InSingletonScope(); 
    } 

} 

public class Global : NinjectWcfApplication 
{  
    protected override IKernel CreateKernel() 
    { 
     IKernel kernel = new StandardKernel(new NinjectBindings()); 
     return kernel; 
    } 
} 

//Test method that fails with ArgumentNullException 
    [TestMethod] 
    public void Should_Be_Able_To_Get_Employee_Service_From_Ninject() 
    { 
     Global globalService = new Global(); 

     var kernel = globalService.Kernel; 

     EmployeeService employeeService = kernel.Get<EmployeeService>(); 

     Assert.IsNotNull(employeeService); 
    } 

答えて

0

Globalを作成した後、IISが行うように、Application_Start()とを呼び出すことで正しく初期化する必要があります。この後、統合テストを実行する必要があります。

実際には、kernel.Getはテストの際に直接トリガされないことに注意してください。サービスの作成ははるかに複雑です。

+0

グローバルは単なるクラスであり、global.asaxではありません。問題が発生しているかどうかはわかりません(私はウェブサービスの悩みです)。あなたが私のユニットテストに合格するためのコードを提供できますか?私は完全に明確ではない、ありがとう。 – Mike

+0

グローバルは、使用できないHttpApplicationであるNinjectWcfApplicationから派生しています。 https://github.com/ninject/ninject.extensions.wcf/tree/Maintenance_2.2/srcを参照してください。 –

0

Ninject.Wcfを使用する場合は、あなたがやったように、あなたのGlobal doesntのはnew Dを取得する - NinjectWcfHostFactory〜あなたがグローバルを作成するための工場があることをWCFを伝える、だCreateKernel()をトリガしますあなたの文脈では起こらない。

この例では、工場のオーバーライドを示しています(.svcファイル内のサービス宣言のプロパティにあります)。

+0

ご返信ありがとうございます。私はウェブサービスと新機能に少し新しかったです。私が私の訂正方法をより良く理解できるように、少しコードを投稿できますか? – Mike

+0

@Beavis:ソースの周りを追いかけようとしないが、幸いにも@Remo Gloorはやった。今日も同じ質問をする別の人がいます。その答えを見てください。ちょうどa)あなたが誤った仮定に取り組んでいることを指摘しておきたい。b)正確な近似を示す鼻腔のgithub上のサンプルがある。 –