首先,我想说的是,围绕这个问题,有很多关于SO和google搜索的答案,然而,我遇到了一个问题,阻碍了这些解决方案的工作。答案here似乎是要走的路。(kernel.Inject(Roles.Provider);)
我遇到的问题是,当我试图注入RoleProvider Roles.Provider时,它是空的,但是我的自定义提供程序在Roles.Providers中的列表中找到了。我在想,Ninject试图过早地访问角色提供程序。
在我的NinjectWebCommon类中,它似乎正在使用WebActivator启动它自己。[assembly: WebActivator.PreApplicationStartMethod(typeof(Admin.App_Start.NinjectWebCommon), "Start")]
似乎我遇到的所有文章都在使用较旧版本的Ninject,并且在Global.asax Application_Start中做了很多繁重的工作……使用我的实现,我如何让DI为自定义角色提供程序工作?
我在我的自定义提供程序中使用[Inject]属性。
发布于 2014-04-02 22:11:24
甚至在创建标准ASP.NET堆栈之前,WebActivator管道就已经运行了。这意味着在NinjectWebCommon中引导时,您将无法访问由ASP.NET创建的任何内容。
仅使用该文件来声明绑定,即不依赖于要启动的的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类是一个惰性单例,它在NinjectWebCommon.cs中初始化了一个静态IKernel。因此,这是从NinjectWebCommon外部检索已配置内核实例的正确方法。
试试看。
https://stackoverflow.com/questions/22792681
复制相似问题