2

首先,我想说关于 SO 和 google 搜索有很多答案,但是我遇到了一个问题,阻止了这些解决方案的工作。这里的答案似乎是要走的路。( kernel.Inject(Roles.Provider);)

我遇到的问题是,当我尝试注入时RoleProvider Roles.Provider为 null,但是我的自定义提供程序位于Roles.Providers. 我认为 Ninject 正试图过早访问角色提供程序。

在我的NinjectWebCommon课堂上,它似乎是WebActivator用来启动自己的。[assembly: WebActivator.PreApplicationStartMethod(typeof(Admin.App_Start.NinjectWebCommon), "Start")]

看来我遇到的所有文章都使用旧版本的 Ninject 并且在 Global.asax Application_Start 中做了很多繁重的工作......使用我的实现如何让 DI 为自定义角色提供程序工作?

[Inject]在我的自定义提供程序中使用该属性。

4

1 回答 1

1

甚至在创建标准 ASP.NET 堆栈之前,WebActivator管道就已经运行了。这意味着您将无法访问 ASP.NET 在引导期间创建的任何内容NinjectWebCommon

仅使用该文件来声明不依赖于 ASP.NET 内容的绑定。为了解决这个问题,您应该使用Global.asax Application_Start处理程序来加载任何其他依赖于 ASP.NET 内容的模块/绑定,例如Roles.Provider.

这是一个可以解决您的问题的建议:

public void Application_Start()
{
    var kernel = (new Bootstrapper()).Kernel;
    kernel.Inject(Roles.Provider);

    //Other initialization stuff
}

该类Bootstrapper是一个惰性单例,它IKernel在你的NinjectWebCommon.cs. 所以这是从你的外部NinjectWebCommon检索配置的内核实例的正确方法。

试试看。

于 2014-04-02T14:11:23.757 回答