2016-07-22 6 views
0

Ich habe eine Abstraktion über die MemoryCache, diese Instanz verwendet AbsoluteExpiration für seine CacheItemPolicy und wird von Autofac wie folgt verwaltet:Memory mit absoluteExpiration in einem IOC-Container gespeichert ist .SingleInstance()

builder 
    .RegisterType<MyCache>() 
    .As<IMyCache>() 
    .SingleInstance() 
    .WithParameter("cacheName", "MyCache"); 

Theoretisch möchte ich die Gegenstände verfallen absolut (zB in 15 Minuten).

Das Problem (die Frage) ist, dass es eine einzige Instanz über alle Anfragen und keinen Mechanismus gibt, der den Ablauf auf 15 Minuten in der Zukunft zurücksetzt. Also die Aktualisierung würde nur ein einziges Mal passieren, oder?

Was ist die Lösung dafür? Muss ich mich in eine Veranstaltung einklinken oder so ...?

+1

können Sie den Code für MyCache veröffentlichen? –

Antwort

0

Mein Problem war, dass ich einen bestimmten Zeitpunkt angeben muß, wo der Cache-Schlüssel gültig bis:

AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15) 

Die Cache-Politik in einem private readonly field gesetzt wurde, die nur initialisiert wird, wenn eine Instanz von MyCache zu schaffen, Dies geschieht jedoch nur beim Start der Anwendung (IoC-Container, einzelne Instanz).

Dies funktioniert für mich jetzt:

private CacheItemPolicy CachePolicy => new CacheItemPolicy 
{ 
    AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15) 
}; 

Jedesmal, die Cache-Speicherelement Politik zugegriffen wird, wird eine neue DateTimeOffset berechnet.

1

Cache-Artikelrichtlinien funktionieren pro Artikel. Fügen Sie ein Element hinzu, das 15 Minuten später abläuft (basierend auf Ihrer Artikelrichtlinie). Es gibt kein "Reset" oder etwas, das benötigt wird. Es funktioniert nicht wie ein Timer oder Semaphor - fügen Sie Zeug, Cache behandelt den Rest.

Sie können dies testen, indem Sie die Richtlinie ausreichend kurz (eine Minute?) Hinzufügen und warten.

+0

Ja, aber mein Problem war, dass ich einen bestimmten Zeitpunkt angeben muss, an dem der Cache-Schlüssel abläuft: 'AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes (15)'. Die Cache-Richtlinie wurde in einem privaten schreibgeschützten Feld festgelegt, das nur initialisiert wird, wenn eine Instanz von 'MyCache' erstellt wird. Dies geschieht jedoch nur beim Start der Anwendung (IOC-Container, einzelne Instanz). Das funktioniert jetzt für mich: 'private CacheItemPolicy CachePolicy => neue CacheItemPolicy {AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes (15) ...};'. Jedes Mal, wenn auf die Cache-Element-Richtlinie zugegriffen wird, wird ein neues DateTimeOffset berechnet. – timmkrause

Verwandte Themen