我可以使用Ninject来实例化任何依赖的单件服务吗?

我的asp.net mvc应用程序中有一些服务可以监听AMQP消息并调用方法。

没有控制器依赖于此,因此它不会自行实例化。

我可以手动实例化它,明确地提供它与kernel.Get依赖关系,但感觉我不应该这样做。

即使没有别的东西依赖它,我能否热切地让Ninject在单例范围内实例化类?

你不能让ninject实例化东西,以防你不要求它自己实例化。 简单的方法是让ninject在组合根处实例化事物:

 var kernel = new StandardKernel(); kernel.Bind().To(); kernel.Load(AppDomain.CurrentDomain.GetAssemblies()); // loads all modules in assemlby //... // resolution root completely configured kernel.Resolve(); kernel.Resolve(); 

实际上,有一种替代方案不同,但可用于实现类似的效果。 它要求尽快实例化至少一个其他服务: Ninject.Extensions.DependencyCreation 。 它的工作原理如下:

 kernel.Bind().ToConstant("hello"); kernel.Bind().To() .InSingletonScope(); kernel.DefineDependency(); kernel.Get(); // when asking for a string for the first time // ISingletonDependency will be instantiated. // of course you can use any other type instead of string 

为什么

Ninject不像其他一些容器(例如Autofac)不是分阶段“建造”的。 没有先创建绑定,然后创建内核以使用它们的概念。 以下是完全合法的:

 kernel.Bind()... kernel.Get()... kernel.Bind()... kernel.Get()... 

所以ninject不可能知道你什么时候想要实例化单例。 使用autofac, 它清晰简单 :

 var containerBuilder = new ContainerBuilder(); containerBuilder .RegisterType() .AutoActivate(); var container = containerBuilder.Build(); // now