我有一个库/集合,它在内存中缓存对象的实例,因此每个请求都不需要返回到数据存储。我希望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变得容易。