2010-11-27 79 views
10

在MVC的基礎控制器中,我有以下注入代碼,它的工作完美。Ninject停止注入我的屬性

[Inject] 
private INavigationRepository navigationRepository { get; set; } 
[Inject] 
private ISessionService sessionService { get; set; } 

我得不到編譯錯誤,它體現在死亡的黃頁上司爲「System.NullReferenceException:未設置爲一個對象的實例對象引用」並指向引用navigationRepository的第一行代碼。

我有可能很少的代碼更改,因爲它正在工作,甚至支持這些更改,但仍然出現錯誤。我可以用下面的代碼解決它,但我失去了注射。有關如何解決這個問題的任何想法?

private INavigationRepository navigationRepository; 
    private ISessionService sessionService; 
    public BaseController() 
    { 
     navigationRepository = new NavigationRepository(); 
     sessionService = new SessionService(new VolunteerRepository()); 
    } 

回答

33

Ninject可以注入私有屬性,但必須啓用它。

new StandardKernel(new NinjectSettings() { InjectNonPublic = true }) 

但更好的是不使用屬性注入。只有在無法避免的情況下才能使用它。例如。如果強制是由其他人創建的(AttributeFilter)。否則,可以從外部非意外地設置依賴關係,並且您需要Inject屬性,它將爲您提供對IoC容器的引用。我建議添加一個依賴到構造函數並使用構造函數注入。

+0

+1好的答案。順便說一句,感謝您近期在Ninject上所做的出色工作,Remo。 – StriplingWarrior 2010-11-27 22:32:31

1

將屬性更改爲公共工作。我猜如果它是私密的,Ninject無法設置它。

[Inject] 
public INavigationRepository navigationRepository { get; set; } 
[Inject] 
public ISessionService sessionService { get; set; } 
+3

你可以添加這個作爲你的問題的編輯或評論的答案嗎?並且不要忘記用CtrlK將代碼縮進4以使其看起來正確 – 2010-11-28 08:01:41