Ninject:每次调用 Get 时调用一个方法
Ninject: call a method with each Get call
我在 Ninject 上有一个 Singleton Binding,我想在 DI 解析它时调用一个方法(即每次 Get 调用)。 Ninject 具有仅在解析对象时调用的 OnActivation 方法。
我知道使用 Transient 范围将是直观的解决方案,但由于失控的原因。对象必须是单例的。
你可以通过一些技巧来实现这一点。
让我举个例子:
const string Name = "Foo";
// Singleton Binding. Will only be used when the context uses the {Name}
Bind<Foo>().To<Foo>()
.Named(Name)
.InSingletonScope();
// Unnamed binding with method call on each resolution
Bind<Foo>().ToMethod(ctx =>
{
// Do anything arbitrary here. like calling a method...
return ctx.Kernel.Get<Foo>(Name));
});
当从内核请求 Foo
(未命名)时,它将解析为 ToMethod
绑定 - 您可以在其中插入任何您喜欢的任意代码。最后,该方法必须使用内核来请求 Foo
,但这次带有名称条件。这将解析为命名的单例绑定。
我在 Ninject 上有一个 Singleton Binding,我想在 DI 解析它时调用一个方法(即每次 Get 调用)。 Ninject 具有仅在解析对象时调用的 OnActivation 方法。
我知道使用 Transient 范围将是直观的解决方案,但由于失控的原因。对象必须是单例的。
你可以通过一些技巧来实现这一点。 让我举个例子:
const string Name = "Foo";
// Singleton Binding. Will only be used when the context uses the {Name}
Bind<Foo>().To<Foo>()
.Named(Name)
.InSingletonScope();
// Unnamed binding with method call on each resolution
Bind<Foo>().ToMethod(ctx =>
{
// Do anything arbitrary here. like calling a method...
return ctx.Kernel.Get<Foo>(Name));
});
当从内核请求 Foo
(未命名)时,它将解析为 ToMethod
绑定 - 您可以在其中插入任何您喜欢的任意代码。最后,该方法必须使用内核来请求 Foo
,但这次带有名称条件。这将解析为命名的单例绑定。