2011-07-12 73 views
0

我正在嘗試將Ninject與我的WCF服務一起使用。我正在使用Ninject 2.2.1.4和Ninject.Extensions.Wcf 2.2.0.4。我的單元測試,以確保Ninject正常工作失敗,帶有ArgumentNullException;參數root:null。Ninject + WCF問題

這裏是我的代碼:

//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之後,您必須通過調用Application_Start()Init()來像IIS那樣正確初始化它。在此之後,您的集成測試應該運行。

但請注意,實際上kernel.Get不會像您在測試中那樣直接觸發。服務的創建要複雜得多。

+0

全球只是一個類,而不是global.asax ...不知道這是否導致問題(我是一個Web服務noob)。你能提供一些代碼來幫助我糾正並讓我的單元測試通過嗎?我不完全清楚,謝謝。 – Mike

+0

全局派生自NinjectWcfApplication,它是一個無法使用的初始化的HttpApplication。請參閱https://github.com/ninject/ninject.extensions.wcf/tree/Maintenance_2.2/src –

0

使用Ninject.Wcf,你Global犯規得到new d爲你做 - 你告訴WCF,該工廠用於創建全球的〜NinjectWcfHostFactory,這會觸發CreateKernel()這是不在你的情況下發生。

該示例顯示了工廠的覆蓋(在.svc文件中的服務聲明中的propery)。

+0

感謝您的回覆。我對Web服務和ninject有點新。你可以發佈一些代碼,以幫助我更好地瞭解如何糾正我的錯誤? – Mike

+0

@Beavis:不打算追逐來源,但幸運的是@Remo Gloor做到了。還有一個人今天也問了幾乎相同的問題 - 請看這個問題的答案。只是想指出:a)你正在做假設b)ninject github上有示例顯示正確的喜好。 –