2

基本上在我的Global.asax代码中,我有以下IKernel用于 Ninject 设置的属性(也利用了 Microsoft.Practices.ServiceLocation)。一旦它出现在CreateKernel()覆盖上,就会自动调用这个 Container:

protected override IKernel CreateKernel()
        {
            return Container;
        }

和我的容器属性:

static IKernel _container;
        public static IKernel Container
        {
            get
            {
                if (_container == null)
                {
                    _container = new StandardKernel();
                    _container.Load(new SiteModule(_container));
                    ServiceLocator.SetLocatorProvider(() => _container.Get<IServiceLocator>());
                }
                return _container;
            }
        }

如您所见,我正在加载一个模块,该模块定义了我的接口<->服务绑定列表,但这对这个问题并不重要,但我的问题是 - 无论我看起来多么努力,我都无法得到当我重新启动 MVC 网站时,我的 _ containernull 再次被初始化。从编辑和重新保存 Web.config 文件(旧技巧)到刷新应用程序池甚至重新启动 IIS(!),我的容器显然仍然存在。我真的不明白这是怎么回事。我知道我的初始加载_container为空并且SiteModule加载正确。

这当然是一个问题,因为我现在希望为新创建的服务添加一些新绑定,并且容器永远不会返回 null :P

供参考。即使将我的断点移动到容器空测试中似乎也没有解决这个问题,不要问我这不能解决问题,但我知道 if 应该是有效的,因为在初始加载时有没有错误,一切都很好。

谢谢大家,如果您觉得需要查看,请SiteModule()告诉我,我可以使用代码扩展这篇文章。

4

2 回答 2

0

您是否尝试过重新启动您的网络服务器?我意识到这可能不是生产中的一个选项,但它应该让你通过开发阶段(如果它有效的话)。

于 2010-05-20T15:05:06.983 回答
0

如果我没记错的话,在(查看源代码CreateKernel())期间只调用一次,所以除非您在其他地方使用,否则缓存它有什么好处吗?Application_Start()Container

你有没有尝试过这样的事情?

protected override IKernel CreateKernel()
{
    IKernel kernel = new StandardKernel();

    // Do your Load() and ServiceLocator stuff here

    return kernel;
}

供参考,Ninject 网站的实现

于 2010-05-21T20:32:44.320 回答