-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcaching.html
94 lines (72 loc) · 5.11 KB
/
caching.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>ASP.NET Boilerplate</title>
<link type="text/css" rel="stylesheet" href="bootstrap.min.css" />
</head>
<body>
<div class="document-contents">
<h3>Introduction</h3>
<p>ASP.NET Boilerplate fournit une abstraction pour la gestion du cache. Il utilise lui-même cette abstraction. Bien que l'implémentation par défaut utilise
<a href="https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.110).aspx?f=255&MSPPError=-2147217396">
MemoryCache</a>, il est possible de l'implémenter au profit d'un autre gestionnaire de cache.</p>
<h3>ICacheManager</h3>
<p>L'interface principale pour la gestion du cache est <strong>ICacheManager</strong>. Nous pouvons utiliser l'<a href="/Pages/Documents/Dependency-Injection">injection</a> pour utiliser et accéder à un cache. Exemple:</p>
<pre lang="cs">public class TestAppService : ApplicationService
{
private readonly ICacheManager _cacheManager;
public TestAppService(ICacheManager cacheManager)
{
_cacheManager = cacheManager;
}
public Item GetItem(int id)
{
//Essai d'accès à l'item par le cache...
return _cacheManager
.GetCache("MyCache")
.Get(id.ToString(), () => GetFromDatabase(id)) as Item;
}
public Item GetFromDatabase(int id)
{
//... récupération depuis la bdd
}
}</pre>
<p>Dans cet extrait, nous injectons <strong>ICacheManager</strong> et avons accès à un cache appelé <strong>MyCache</strong>.</p>
<div class="bs-callout bs-callout-warning">
<h4><strong>ATTENTION:</strong> La méthode GetCache</h4>
<p>N'utilisez pas la méthode GetCache dans votre constructeur. Cela pourrait vider le Cache si votre classe est transient. (instanciée à chaque usage)</p>
</div>
<h3>ICache</h3>
<p>La méthode ICacheManager.<strong>GetCache</strong> fournit une instance d'<strong>ICache</strong>.
Un Cache est singleton (par nom de cache). Il est créé au premier usage et le même objet est ensuite retourné pour toutes les autres demandes. Nous pouvons donc partager ce même cache (du même nom) à toutes les autres classes. (clientes).</p>
<p>Dans le code exemple, nous avons un usage basique de la méthode ICache.<strong>Get</strong>. Il comporte deux arguments:</p>
<ul>
<li><strong>key</strong>: Une chaine unique utilisée comme identifiant de l'item à retourner.</li>
<li><strong>factory</strong>: Une action qui sera appelée si l'objet n'existe pas pour la clef spécifiée. La méthode Factory devrait créer et retourner l'item indiqué. Elle ne sera pas appelée si l'objet correspondant à la clef spécifiée est déjà présent dans le cache.</li>
</ul>
<p>L'interface ICache possède aussi d'autres méthodes comme <strong>GetOrDefault</strong>,
<strong>Set</strong>, <strong>Remove</strong> et <strong>Clear</strong>.
Il existe aussi les versions asynchrones <strong>(async)</strong> de toutes ces méthodes.</p>
<h3>ITypedCache</h3>
<p>L'interface <strong>ICache</strong> utilise le type <strong>string</strong> comme clef et <strong>object</strong> en valeur. <strong>ITypedCache</strong> est un <em>wrapper</em> pour ICache permettant de <strong>typer avec précaution</strong> le cache générique. Pour convertir ICache en ITypedCache, nous pouvons utiliser l'extension de méthode <strong>AsTyped</strong> comme ceci:</p>
<pre lang="cs">ITypedCache<int, Item> myCache = _cacheManager.GetCache("MyCache")<strong>.AsTyped<int, Item>()</strong>;</pre>
<p>Nous pouvons ensuite appeler la méthode Get sans avoir à convertir ou à caster manuellement.</p>
<h3>Configuration</h3>
<p>Par défaut, le cache expire au bout de 60 minutes. Ce délai est lissé. Cela veut dire que si vous n'utilisez pas un item du cache pendant 60 minutes, il sera automatiquement supprimé du cache. Ce délai est à définir globalement ou pour un seul cache.</p>
<pre>//Configuration pour tous les caches
Configuration.Caching.ConfigureAll(cache =>
{
cache.DefaultSlidingExpireTime = TimeSpan.FromHours(2);
});
//Configuration pour un cache spécifique
Configuration.Caching.Configure("MyCache", cache =>
{
cache.DefaultSlidingExpireTime = TimeSpan.FromHours(8);
});</pre>
<p>Ce code devrait être placé au niveau de la méthode <a href="/Pages/Documents/Module-System#DocModulePreInit"><strong>PreInitialize</strong></a> de votre module. Dans le précédent code, MyCache dispose d'un cache de 8 heures alors que tous les autres sont paramétrés sur 2 heures.</p>
<p>Votre action de configuration est exécutée une seule fois lorsque le cache est créé. (à la première sollicitation). La configuration ne se limite pas à DefaultSlidingExpireTime
car l'objet cache implémente ICache, toutes ses propriétés et méthodes permettent de l'initaliser et de le configurer.</p>
</div>
</body>
</html>