2017-04-04 6 views
0

Orchard를 사용하고 있으며 인증 된 사용자에게 특정한 데이터를 캐시하고 싶습니다.Orchard는 ICacheManager를 사용하여 인증 된 사용자 데이터를 캐시합니다.

새 사용자가 로그인하거나 일정 기간 후에 데이터베이스를 다시 쿼리해야합니다.

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

    return data; 
} 

을하지만, 새로운 사용자가 로그온 할 때 어떻게 데이터베이스를 쿼리 다시 캐시를 강제 : 나는 아래이의 절반을 달성 한

(30 분 후 다시 데이터베이스를 쿼리합니다) 에서?

ISignals가 관련되어 있지만이를 구현하는 방법이 확실하지 않은 느낌이 들었습니다.

감사합니다.

+0

내 대답이 도움이 되었습니까? – Xceno

답변

0

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

알고 :

당신은 ISignals를 주입하고이처럼 사용할 필요가 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); 
} 

이제 Orchard.Users.Events.IUserEventHandler 및 invalidat에 대한 사용자 정의 EventHandler를 구현할 수 있습니다. 캐시는 LoggedIn에 있습니다.

private readonly Orchard.Caching.ISignals _signals; 

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