如何为一个全局范围的单例对象创建绑定,该对象的实例在一定时间后过期?一旦对象过期,我希望Ninject在该实例到期之前提供新实例,等等......
伪绑定以实现这个想法:
Bind<Foo>().ToSelf()
.InSingletonScope()
.WithExpiration(someTimeSpan);
我不是在寻找那种确切的语法,而是一种最终获得所需结果的方法。从本质上讲,它就像使用Ninject作为滑动应用缓存一样。
更新 伊恩建议的方法是正确的。我只需稍微调整一下,因为使用DateTime作为上下文键由于某种原因不起作用。这就是我最终的结果:
var someTimeInFuture = DateTime.Now.AddSeconds(10);
var fooScopeObject = new object();
Func<IContext, object> scopeCall = ctx =>
{
if (someTimeInFuture < DateTime.Now)
{
someTimeInFuture = DateTime.Now.AddSeconds(10);
fooScopeObject = new object();
}
return fooScopeObject;
};
Kernel.Bind<Foo>()
.ToSelf()
.InScope(scopeCall);
答案 0 :(得分:2)
您实际上是在定义定时范围。您可以使用自定义范围函数进行绑定,并在一段时间后返回null。
var someTimeInFuture = DateTime.Now.AddMinutes(5);
Func<IContext,object> scopeCall = ctx => DateTime.Now > someTimeInFuture ? null : someTimeInFuture;
Kernel.Bind<Foo>().ToSelf().InScope(scopeCall);
我现在无法对此进行测试,但这可能有效。
答案 1 :(得分:2)
您可以使用InScope(功能范围)。正如文档所述:
表示只要对象重新使用通过绑定激活的实例 由提供的回调返回仍然活着(也就是说,没有被垃圾收集)。
您需要实现自己的自定义范围来处理您的方案。如何实现自己的作用域的一个很好的例子是来自
的命名作用域扩展