我有一个库/集合,它在内存中缓存对象的实例,因此每个请求都不需要返回到数据存储。我希望Autofac提供此银行的一个实例,但是在x秒后将其过期,以便在下一个请求时创建一个新实例。我很难建立起LifetimeScope来实现这一目标。我已经读过几次this。银行对象实际上并不受工作单位约束。理想情况下,它将驻留在所有工作单元的“上方”,将对象缓存在它们之间或内部。

我目前正在使用下面的方法,但是它没有按我希望的那样工作。

有人可以指出正确的方向吗?

....
builder.Register(c =>
            {
                return new ORMapBank(c.Resolve<IORMapRoot>());
            }).InstancePerMatchingLifetimeScope(ExpireTimeTag.Tag());


        IContainer container = builder.Build();
        var TimedCache= RootScope.BeginLifetimeScope(ExpireTimeTag.Tag());
        DependencyResolver.SetResolver(new AutofacDependencyResolver(TimedCache));


....

public static class ExpireTimeTag
{
    static DateTime d = DateTime.Now;
    static Object tag = new Object();

    public static object Tag()
    {
        if (d.AddSeconds(10) < DateTime.Now)
        {
            CreateTag();
        return tag;
    }

    private static void CreateTag()
    {
        tag = new Object();
    }
}


首先十分感谢。

最佳答案

通常使用缓存装饰器来实现这种行为。假设您的IORMapRoot负责获取有问题的数据(但是,如果ORMapBank可以正常工作),请执行以下操作:


创建实现CachingORMapRoot的新类型IORMapRoot
添加一个采用到期时间TimeSpan的构造函数和原始IORMapRoot实现的实例。
实现成员以调用基础实例,然后相应地缓存结果以用于后续调用(实现将因缓存技术而异)。
在容器中将此类型注册为IORMapRoot


这是实现这种缓存的非常干净的方法。这也使switch between cached and non-cached implementations变得容易。

10-07 17:18