Dependency injection 如何创建过期的单例绑定?

Dependency injection 如何创建过期的单例绑定?,dependency-injection,ninject,Dependency Injection,Ninject,如何为实例在一定时间后过期的全局范围的单例对象创建绑定?一旦对象过期,我希望Ninject提供一个新实例,直到该实例过期,等等 通过伪绑定来传达想法: Bind<Foo>().ToSelf() .InSingletonScope() .WithExpiration(someTimeSpan); Bind().ToSelf() .InSingletonScope() .到期时(有时); 我不是在寻找确切的语法,而是寻找一种最终得到所需结果的方法。本质上,这就像使用N

如何为实例在一定时间后过期的全局范围的单例对象创建绑定?一旦对象过期,我希望Ninject提供一个新实例,直到该实例过期,等等

通过伪绑定来传达想法:

Bind<Foo>().ToSelf()
    .InSingletonScope()
    .WithExpiration(someTimeSpan);
Bind().ToSelf()
.InSingletonScope()
.到期时(有时);
我不是在寻找确切的语法,而是寻找一种最终得到所需结果的方法。本质上,这就像使用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);   
var someTimeInFuture=DateTime.Now.AddSeconds(10);
var fooScopeObject=新对象();
Func scopeCall=ctx=>
{
if(someTimeInFuture
您实际上是在定义一个定时范围。您可以使用自定义作用域函数进行绑定,并在一段时间后返回null

var someTimeInFuture = DateTime.Now.AddMinutes(5);
Func<IContext,object> scopeCall = ctx => DateTime.Now > someTimeInFuture ? null : someTimeInFuture;
Kernel.Bind<Foo>().ToSelf().InScope(scopeCall);
var someTimeInFuture=DateTime.Now.AddMinutes(5);
Func scopeCall=ctx=>DateTime.Now>someTimeInFuture?null:someTimeInFuture;
Kernel.Bind().ToSelf().InScope(scopeCall);
我现在无法测试此功能,但这可能会起作用。

您可以使用InScope(Func scope)。如文件所述:

指示只要对象 由提供的回调返回的数据保持活动状态(即,尚未进行垃圾收集)

您需要实现自己的自定义范围来处理您的场景。如何实现自己的作用域的一个很好的示例是来自的命名范围扩展


我想您需要Func scopeCall=ctx=>DateTime.Now>someTimeInFuture?null:someTimeInFuture;非常感谢!这或多或少是正确的,只是范围调用在返回日期时间时不能正常工作。结构不能用于确定作用域(我的最佳猜测)。通常情况下,您不希望缓存服务,而是缓存这些服务管理的数据。那你为什么要这么做?我完全理解你的意思。这是用来在一个棕地应用程序中获得一些便宜的缓存,而不做任何重大的架构更改。。。这意味着我们故意使用反模式,以便在不改变架构的情况下从几个故障点中寻找性能。感谢您的澄清。这听起来是个合理的理由。最终(软件)工程都是关于权衡的。什么是
Kernel.Bind