我正在使用Orchard,并希望缓存特定于经过身份验证的用户的数据。
当新用户登录时,或一段时间后,应再次查询数据库。
我已经完成了下面的一半(30 分钟后它将再次查询数据库(:
private UserData SomeUserSpecificData()
{
var data = _cacheManager.Get("userdata",
ctx => {
ctx.Monitor(_clock.When(TimeSpan.FromMinutes(30)));
return GetDatabaseData();
});
return data;
}
但是,当新用户登录时,如何强制缓存重新查询数据库?
我有一种感觉,它可能涉及 ISignals,但不确定如何实现这一点。
谢谢。
你对ISignals
是绝对正确的!
你只需要注入ISignals
并像这样使用它:
private readonly Orchard.Caching.ISignals _signals;
private UserData SomeUserSpecificData()
{
var data = _cacheManager.Get("userdata",
ctx => {
ctx.Monitor(_clock.When(TimeSpan.FromMinutes(30)));
cts.Monitor(_signals.When("SOMETHING_HAPPENED_FOR_xyz"));
return GetDatabaseData();
});
return data;
}
同样值得一提的是:您可以监控任意数量的信号。
为了保持整洁,我通常会创建一个静态类,如下所示:
public static class CacheSignals
{
public const string SomethingHappened = "SOMETHING_HAPPENED";
public const string SomethingHappenedForUser(int userId) => string.Format("SOMETHING_HAPPENED_FOR_{0}", userId);
}
现在,您只需为Orchard.Users.Events.IUserEventHandler
实现自定义事件处理程序并使LoggedIn
上的缓存失效。
private readonly Orchard.Caching.ISignals _signals;
public void LoggedIn(Security.IUser user)
{
_signals.Trigger(CacheSignals.SomethingHappenedForUser(user.Id));
}