创建一个随时间过期的Autofac Lifetimescope

时间:2011-07-04 06:17:40

标签: autofac

我有一个bank / collection,用于在内存中缓存对象的实例,这样每个请求都不需要返回数据存储区。我希望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();
    }
}

非常感谢提前。

1 个答案:

答案 0 :(得分:7)

通常使用缓存装饰器来实现这种行为。假设您的IORMapRoot负责获取相关数据(但如果ORMapBank,它会起作用),请执行以下操作:

  • 创建一个实现CachingORMapRoot
  • 的新类型IORMapRoot
  • 添加一个过期TimeSpan的构造函数和原始IORMapRoot实现的实例。
  • 实现成员以调用基础实例,然后相应地缓存结果以用于后续调用(实现将根据您的缓存技术而有所不同)。
  • 在容器中将此类型注册为IORMapRoot

这是实现此类缓存的一种非常简洁的方法。这也使switch between cached and non-cached implementations变得容易。