2012-04-11 82 views
0

我想使用Ninject綁定存儲庫到屬性,但總是得到綁定對象的空引用。我將使用下面的代碼來解釋這個問題。綁定到屬性總是返回null

public interface IServiceRepository 
    { 
     User GetUser(string email); 
     IQueryable<Statistic> GetStatisticForCurrentMonth(string ip); 
     void InsertStatistic(ConversionModel conversionModel); 

class ServiceRepository : IServiceRepository 
{ 
//Implementation of the Interface 
} 

我同時創建該類想bind the repository aboveclass below。不幸的是Repository對象總是null。也許我誤解了Ninject的工作方式?如何解決問題?

public class Converter 
    { 
     [Inject] 
     public static IServiceRepository Repository { get; set; } 
     private static Converter _converter; 

     public static Converter Instance 
     { 
      get { return _Converter ?? (_Converter = new Converter()); 
     } 
} 

Ninject激活代碼

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IServiceRepository>().ToMethod(context => Converter.Repository); 
} 

更新

我試圖重寫這樣

public class Converter 
    { 
     private readonly IServiceRepository _repository; 

     public Converter(IServiceRepository repository) 
     { 
      _repository = repository; 
     } 

//skip code 
} 

測試代碼...

[TestMethod] 
    public void ConverterInstanceCreated() 
    {   
     using (IKernel kernel = new StandardKernel()) 
     {     
      kernel.Bind<IServiceRepository>().To<ServiceRepository>(); 
      Assert.IsNotNull(kernel.Get<Converter>()); 
     } 
    } 

給人例外

Test method PC.Tests.NinjectTest.ConverterInstanceCreated threw exception: 
Ninject.ActivationException: Error activating IServiceRepository 
No matching bindings are available, and the type is not self-bindable. 
Activation path: 
    2) Injection of dependency IServiceRepository into parameter repository of constructor of type Converter 
    1) Request for Converter 

我只是失去了,我想了解Ninject是如何工作了一週沒有任何成功。在我的情況下,爲什麼拋出這個異常?

也請有人發表一個存儲庫注入到單身類的工作示例。

回答

2

Ninject不注入靜態。將coynverter更改爲非靜態類,並將其配置爲ninject中的Singleton。也使用構造函數注入並使回購一個私人領域。

現在您可以將轉換器注入到需要它的構造函數中。

+0

我已經更新的代碼後,我仍然無法得到它的工作:( – Tomas 2012-04-12 08:19:05

+0

請無視,我已經解決了這個問題 – Tomas 2012-04-12 08:31:26

+0

@Tomas您的代碼仍然顯示靜態的 - 除非你會刪除你應該在你的問題後續問題 – 2012-04-12 08:35:00

0

即使你使用屬性注入,而不是構造函數注入,我認爲它仍然是

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IServiceRepository>().To<ServiceRepository>(); 
} 

由於ninject仍然只是需要知道映射哪些具體類型的接口

我的天堂」如果它是錯誤的,那麼測試這個很抱歉。

+0

我測試,並得到空:( – Tomas 2012-04-11 15:00:35