将Ninject属性设置为private

时间:2015-06-12 15:02:54

标签: c# .net ninject repository-pattern

我有一个使用Ninject的项目。我创建一个接口并在另一个类中实现它。添加以下代码以注册服务

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IArticleContent>().To<ArticleService>().InRequestScope();
}  

创建网页并编写以下代码

[Inject]
public IArticleContent _ArticleContentService { get; set; }

编写更多代码以将数据绑定到控件并所有工作

然后我将上述公开声明更改为私人

[Inject]
private IArticleContent _ArticleContentService { get; set; }

得到

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

经过一些研究后我添加了

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

到Start方法下的NinjectWebCommon类(也尝试使用RegisterServices方法)但是同样的错误。因此,经过进一步的研究,它似乎我需要以另一种方式(即在我的服务类的构造函数内)这样做,或者我需要在其他地方使用上面的代码。

有人可以建议如何在设置私有或“正确”方式时使用Ninject属性吗?

1 个答案:

答案 0 :(得分:0)

除了将InjectNonPublic设置为true之外,还需要将InjectParentPrivateProperties设置为true

var kernel = new StandardKernel(new NinjectSettings
{
    InjectNonPublic = true,
    InjectParentPrivateProperties = true
});

原因是页面类本身实际上是在运行时从相应的aspx文件生成的类的父级。