Skip to content

Commit 71012fa

Browse files
Add Immediate.Cache documentation
1 parent 20e2ae6 commit 71012fa

File tree

8 files changed

+89
-0
lines changed

8 files changed

+89
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
---
2+
title: Creating a cache
3+
---
4+
5+
# {$frontmatter.title}
6+
7+
Create a subclass of `ApplicationCacheBase`, which will serve as the cache for a particular handler. An example:
8+
```cs
9+
[Handler]
10+
public static partial class GetValue
11+
{
12+
public sealed record Query(int Value);
13+
public sealed record Response(int Value);
14+
15+
private static ValueTask<Response> HandleAsync(
16+
Query query,
17+
CancellationToken _
18+
) => ValueTask.FromResult(new Response(query.Value));
19+
}
20+
21+
public sealed class GetValueCache(
22+
IMemoryCache memoryCache,
23+
Owned<IHandler<GetValue.Query, GetValue.Response>> ownedHandler
24+
) : ApplicationCacheBase<GetValue.Query, GetValue.Response>(
25+
memoryCache,
26+
ownedHandler
27+
)
28+
{
29+
protected override string TransformKey(GetValue.Query request) =>
30+
$"GetValue(query: {request.Value})";
31+
}
32+
```
33+
34+
In this case, the `GetValueCache` class will serve as a cache for the `GetValue` IH handler.
35+
36+
## Register the Cache with DI
37+
38+
In your `Program.cs` file:
39+
40+
* Ensure that Memory Cache is registered, by calling:
41+
```cs
42+
services.AddMemoryCache();
43+
```
44+
45+
* Register `Owned<>` as a singleton
46+
```cs
47+
services.AddSingleton(typeof(Owned<>));
48+
```
49+
50+
* Register your cache service(s) as a singleton(s)
51+
```cs
52+
services.AddSingleton<GetValueCache>();
53+
```
54+
55+
## Retrieve Data From the Cache
56+
57+
Using an instance of the `GetValueCache` class that you have created above, you can simply call:
58+
```cs
59+
var response = await cache.GetValue(request, token);
60+
```
61+
62+
If there is a cached value, it will be returned; otherwise a temporary scope will be used to create the handler and
63+
execute it; and the returned value will be stored.
64+
65+
> [!NOTE]
66+
> If simultaneous requests are made while the handler is executing, they will wait for the first handler to
67+
complete, rather than executing the handler a second/simultaenous time.
68+
69+
## Removing Data From the Cache
70+
71+
Using an instance of the `GetValueCache` class that you have created above, you can remove cached data by calling:
72+
```cs
73+
await cache.RemoveValue(request);
74+
```
75+
76+
> [!NOTE]
77+
> If a handler is running based on this request, it will be cancelled, and any callers waiting on the results from
78+
> this handler will experience a `CancellationToken` cancellation.
79+
80+
## Updating Data In the Cache
81+
82+
Using an instance of the `GetValueCache` class that you have created above, you can assign cached data by calling:
83+
```cs
84+
await cache.SetValue(request, response);
85+
```
86+
87+
> [!NOTE]
88+
> If a handler is running based on this request, it will be cancelled, and any callers waiting on the results from
89+
> this handler will immediately receive the updated response.

src/routes/docs/[...5]cookbook/[...1]the-cookbook/+page.md renamed to src/routes/docs/[...6]cookbook/[...1]the-cookbook/+page.md

File renamed without changes.

src/routes/docs/[...5]cookbook/[...2]fluent-validation/+page.md renamed to src/routes/docs/[...6]cookbook/[...2]fluent-validation/+page.md

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

src/routes/docs/[...5]cookbook/[...6]fullstack-vsa/+page.md renamed to src/routes/docs/[...6]cookbook/[...6]fullstack-vsa/+page.md

File renamed without changes.

src/routes/docs/[...6]benchmarks/[...1]performance-comparisons/+page.md renamed to src/routes/docs/[...7]benchmarks/[...1]performance-comparisons/+page.md

File renamed without changes.

0 commit comments

Comments
 (0)