2017-04-04 64 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)); 
}