refactor(apps): 重构数据层目录结构并新增启动预热编排器
This commit is contained in:
+31
-6
@@ -1,20 +1,29 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'cache_entry.dart';
|
||||
import 'cache_policy.dart';
|
||||
import 'hybrid_cache_store.dart';
|
||||
import 'cache_store.dart';
|
||||
|
||||
abstract class CachedRepository<T> {
|
||||
final HybridCacheStore store;
|
||||
final CachePolicy policy;
|
||||
final DateTime Function() now;
|
||||
final Object? Function(T value) encodeValue;
|
||||
final T Function(Object? raw) decodeValue;
|
||||
final Map<String, Future<void>> _refreshInFlight = <String, Future<void>>{};
|
||||
|
||||
CachedRepository({
|
||||
required this.store,
|
||||
required this.policy,
|
||||
DateTime Function()? now,
|
||||
}) : now = now ?? DateTime.now;
|
||||
Object? Function(T value)? encodeValue,
|
||||
T Function(Object? raw)? decodeValue,
|
||||
}) : now = now ?? DateTime.now,
|
||||
encodeValue = encodeValue ?? _defaultEncode,
|
||||
decodeValue = decodeValue ?? _defaultDecode;
|
||||
|
||||
static Object? _defaultEncode<T>(T value) => value;
|
||||
|
||||
static T _defaultDecode<T>(Object? raw) => raw as T;
|
||||
|
||||
Future<T> getOrLoad({
|
||||
required String key,
|
||||
@@ -58,16 +67,32 @@ abstract class CachedRepository<T> {
|
||||
}
|
||||
|
||||
Future<CacheEntry<T>?> readCacheEntry(String key) {
|
||||
return store.read<CacheEntry<T>>(key);
|
||||
return _readDecodedEntry(key);
|
||||
}
|
||||
|
||||
Future<void> writeCacheEntry(String key, T value) {
|
||||
return store.write<CacheEntry<T>>(
|
||||
return store.write<CacheEntry<Object?>>(
|
||||
key,
|
||||
CacheEntry<T>(value: value, fetchedAt: now()),
|
||||
CacheEntry<Object?>(value: encodeValue(value), fetchedAt: now()),
|
||||
);
|
||||
}
|
||||
|
||||
Future<CacheEntry<T>?> _readDecodedEntry(String key) async {
|
||||
final entry = await store.read<CacheEntry<Object?>>(key);
|
||||
if (entry == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return CacheEntry<T>(
|
||||
value: decodeValue(entry.value),
|
||||
fetchedAt: entry.fetchedAt,
|
||||
);
|
||||
} catch (_) {
|
||||
await store.remove(key);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> removeCacheKey(String key) {
|
||||
return store.remove(key);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user