gpt4 book ai didi

autofac - 创建将随时间过期的 Autofac Lifetimescope

转载 作者:行者123 更新时间:2023-12-01 16:18:06 25 4
gpt4 key购买 nike

我有一个银行/集合,它在内存中缓存对象的实例,以便每个请求不需要返回到数据存储。我希望 Autofac 提供该银行的一个实例,但在 x 秒后使其过期,以便在下一个请求时创建一个新实例。我很难理解如何设置 LifetimeScope 来实现这一目标。我已通读this一些时间。 Bank 对象并不真正受制于工作单元。理想情况下,它将驻留在所有工作单元的“之上”,在它们内部和之间缓存对象。

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

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

....
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 .

关于autofac - 创建将随时间过期的 Autofac Lifetimescope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6567940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com