Repository navigation
Expand file tree
/
Copy pathQuick.Core.Extensions.Caching.Hybrid.pas
More file actions
111 lines (89 loc) · 3.58 KB
/
Copy pathQuick.Core.Extensions.Caching.Hybrid.pas
File metadata and controls
111 lines (89 loc) · 3.58 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
{ ***************************************************************************
Copyright (c) 2016-2026 Kike Perez
Unit : Quick.Core.Extensions.Caching.Hybrid
Description : DI extensions — AddHybridCache
Author : Kike Perez
Version : 1.0
Created : 30/04/2026
Modified : 08/05/2026
This file is part of QuickCore: https://github.com/exilon/QuickCore
***************************************************************************
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*************************************************************************** }
unit Quick.Core.Extensions.Caching.Hybrid;
{$i QuickCore.inc}
interface
uses
System.SysUtils,
Quick.Core.DependencyInjection,
Quick.Core.Caching.Abstractions,
Quick.Core.Caching.Hybrid,
Quick.Core.Extensions.Caching.Memory;
type
TConfigureHybridCacheOptionsProc = reference to procedure(aOptions: THybridCacheOptions);
/// <summary>
/// DI extension for IHybridCache.
///
/// Usage (in ConfigureServices):
///
/// // Minimal — L1 only (no distributed cache):
/// services.Extension<THybridCacheServiceExtension>
/// .AddHybridCache;
///
/// // With options:
/// services.Extension<THybridCacheServiceExtension>
/// .AddHybridCache(procedure(o: THybridCacheOptions)
/// begin
/// o.DefaultLocalExpirationMs := 60_000; // 1 min L1
/// o.DefaultRemoteExpirationMs := 600_000; // 10 min L2
/// end);
///
/// // Prerequisite: register IMemoryCache before calling AddHybridCache.
/// // services.Extension<TMemoryCacheServiceExtension>.AddMemoryCache;
/// // Optionally register IDistributedCache for L2:
/// // services.Extension<TRedisCacheServiceExtension>.AddRedisCache(...);
///
/// Then inject:
/// hybridCache := services.GetService<IHybridCache>;
///
/// .NET equivalent:
/// builder.Services.AddHybridCache(o => { o.DefaultEntryOptions = ...; });
/// </summary>
THybridCacheServiceExtension = class(TServiceCollectionExtension)
public
/// <summary>
/// Registers IHybridCache as a singleton.
/// Requires IMemoryCache to already be registered.
/// If IDistributedCache is registered it is used as L2; otherwise L2 is skipped.
/// </summary>
class function AddHybridCache(
aConfigureOptions: TConfigureHybridCacheOptionsProc = nil): TServiceCollection;
end;
implementation
{ THybridCacheServiceExtension }
class function THybridCacheServiceExtension.AddHybridCache(
aConfigureOptions: TConfigureHybridCacheOptionsProc = nil): TServiceCollection;
var
options: THybridCacheOptions;
begin
options := THybridCacheOptions.Create;
if Assigned(aConfigureOptions) then
aConfigureOptions(options);
var l1 := ServiceCollection.Resolve<IMemoryCache>;
var l2 : IDistributedCache := nil;
if ServiceCollection.IsRegistered<IDistributedCache> then
l2 := ServiceCollection.Resolve<IDistributedCache>;
ServiceCollection.AddSingleton<IHybridCache>(
THybridCache.Create(l1, l2, options) as IHybridCache
);
Result := ServiceCollection;
end;
end.