Orchard 使用 ICacheManager 缓存经过身份验证的用户数据



我正在使用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));
}

相关内容

最新更新