2017-04-04 16 views
0

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

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

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

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

    return data; 
} 

但我怎么会强迫缓存重新查询数据库后,新用户登录在?

我有一种感觉,它可能涉及ISIGNALS,但不知道如何实现这一点。

谢谢。

+0

我的回答对你有帮助吗?或者你还需要其他什么吗? – Xceno

回答

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; 
} 

什么也很高兴知道:You can monitor as many signals as you want.

要保持干净的东西我通常会创建一个静态类是这样的:

public static class CacheSignals 
{ 
    public const string SomethingHappened = "SOMETHING_HAPPENED"; 
    public const string SomethingHappenedForUser(int userId) => string.Format("SOMETHING_HAPPENED_FOR_{0}", userId); 
} 

现在你可以简单地实现一个自定义EventHandler Orchard.Users.Events.IUserEventHandler 和invalidat e在LoggedIn上的缓存。

private readonly Orchard.Caching.ISignals _signals; 

public void LoggedIn(Security.IUser user) 
{ 
    _signals.Trigger(CacheSignals.SomethingHappenedForUser(user.Id)); 
} 
相关问题