我需要实例化一个没有其他对象需要引用的对象,只要应用程序正在运行,我希望它能够存活。 它将使用其他服务,但没有其他人需要它的服务。
是否有可能让ninject在开始时创建一个这样的对象并将其保存在内存中,或者我是否需要将其存储在某个地方?如何设置ninject,它将创建我的实例并保持它直到退出?
如果是这样,您对此做法有何看法?
答案 0 :(得分:1)
据我所知,ninject并不提供开箱即用的功能。 但是,当你做的时候
IBindingRoot.Bind<FooService>().ToSelf().InSingletonScope();
然后一个单一的获得:
IResolutionRoot.Get<FooService();
这足以使ninject保持相同的对象存活,直到内核被释放。 您无需保留参考。
您还可以使用DependencyCreation Extension将FooService
的生命周期与其他服务/对象联系起来。
像这样:
IBindingRoot.Bind<SomeSingletonWhichIsInstantiatedAtTheBeginning>().To<...>();
IBindingRoot.DefineDependency<SomeSingletonWhichIsInstantiatedAtTheBeginning, FooService>();
IBindingRoot.Bind<FooService>().ToSelf().InDependencyCreatorScope();
这导致FooService
在实例化SomeSingletonWhichIsInstantiatedAtTheBeginning
时被设置为SomeSingletonWhichIsInstantiatedAtTheBeginning
,并且在OnActivation
被处置/未引用时也被“处置”。
但是,要注意循环依赖!
另一种方法是使用IBindingRoot.Bind<FooService>().ToSelf().InSingletonScope();
IBindingRoot
.Bind<SomeSingletonWhichIsInstantiatedAtTheBeginning>()
.To<...>()
.OnActivation((context, service) => ctx.Kernel.Get<FooService>());
功能来实现与以前相同的功能:
FooService
这将SomeSingletonWhichIsInstantiatedAtTheBeginning
的实例化与FooService
的实例化联系起来,并在内核被释放时删除{{1}}。