.net 要求内核在模块加载时创建单例作用域依赖项的实例
我的ASP.NET MVC 3应用程序使用Ninject IoC容器。其中一个控制器依赖于数据提供者,该提供者需要在网站启动时开始缓存可能需要的内容,而不是在根据请求创建控制器并且正确地需要数据时 为此,我需要让Ninject为我的依赖项创建一个singleton作用域实例,它将在SiteStart上为请求提供数据.net 要求内核在模块加载时创建单例作用域依赖项的实例,.net,asp.net-mvc,inversion-of-control,ninject,.net,Asp.net Mvc,Inversion Of Control,Ninject,我的ASP.NET MVC 3应用程序使用Ninject IoC容器。其中一个控制器依赖于数据提供者,该提供者需要在网站启动时开始缓存可能需要的内容,而不是在根据请求创建控制器并且正确地需要数据时 为此,我需要让Ninject为我的依赖项创建一个singleton作用域实例,它将在SiteStart上为请求提供数据 我该怎么做 您需要将.InSingletonScope()添加到内核内部的映射中。这样,它将始终使用相同的对象。一旦需要该对象,Ninject将加载它,并在此后始终使用相同的对象。您
我该怎么做 您需要将
.InSingletonScope()
添加到内核内部的映射中。这样,它将始终使用相同的对象。一旦需要该对象,Ninject将加载它,并在此后始终使用相同的对象。您需要将.InSingletonScope()
添加到内核内的映射中。这样,它将始终使用相同的对象。一旦需要对象,Ninject将加载它,并在此后始终使用相同的对象。我只需在global.asax中对应用程序启动执行NinjectHttpApplication提供的覆盖操作。如果在global.asax中使用常规HttpApplication(无NinjectHttpApplication覆盖),则只需使用常规HttpApplication_Start事件初始化缓存即可。在这个上下文中触摸IoC容器是可以接受的,因为它是应用程序的复合根。所以我猜是这样的:
Bind<IProvider>().To<CacheProvider>().InSingletonScope(); //<in binding module
Kernel.Get<IProvider>().SetupCache() //<in global.asax
Bind().To().InSingletonScope()// 我只需要在global.asax中对应用程序启动的覆盖执行NinjectHttpApplication提供的任何操作。如果在global.asax中使用常规HttpApplication(无NinjectHttpApplication覆盖),则只需使用常规HttpApplication_Start事件初始化缓存即可。在这个上下文中触摸IoC容器是可以接受的,因为它是应用程序的复合根。所以我猜是这样的:
Bind<IProvider>().To<CacheProvider>().InSingletonScope(); //<in binding module
Kernel.Get<IProvider>().SetupCache() //<in global.asax
Bind().To().InSingletonScope()//谢谢,但我已经明确提到,我需要知道如何在站点启动时初始化依赖项。我知道如何创建单例范围的依赖项。现在我只是在Global.asax中调用一个dependencysolver.Current.GetService
。然后,是的,你需要调用加载这个,这就是我说的在需要时加载对象的意思。如果您没有使用它,那么就没有必要实例化它。谢谢,但我已经明确提到,我需要知道如何在站点启动时初始化依赖项。我知道如何创建单例范围的依赖项。现在我只是在Global.asax中调用一个dependencysolver.Current.GetService
。然后,是的,你需要调用加载这个,这就是我说的在需要时加载对象的意思。如果您没有使用它,那么就没有必要以其他方式实例化它。