2010-11-27 50 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