0

我正在使用 Orchard,并希望缓存特定于经过身份验证的用户的数据。

当有新用户登录时,或一段时间后,应再次查询数据库。

我已经完成了下面的一半(30分钟后它将再次查询数据库):

private UserData SomeUserSpecificData()
{
    var data = _cacheManager.Get("userdata",
        ctx => {
            ctx.Monitor(_clock.When(TimeSpan.FromMinutes(30)));
            return GetDatabaseData();
        });

    return data;
}

但是当新用户登录时,我将如何强制缓存重新查询数据库?

我感觉它可能涉及 ISignals 但不确定如何实现。

谢谢。

4

1 回答 1

0

你完全正确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.IUserEventHandlerLoggedIn.

private readonly Orchard.Caching.ISignals _signals;

public void LoggedIn(Security.IUser user)
{
    _signals.Trigger(CacheSignals.SomethingHappenedForUser(user.Id));
}
于 2017-04-04T17:15:53.710 回答