From 1ba32c90216fd91ebc21fadb025ea0afbc3781a1 Mon Sep 17 00:00:00 2001 From: "1622989459@qq.com" <1622989459@qq.com> Date: Sat, 13 Jun 2026 19:37:48 +0800 Subject: [PATCH 01/10] Add ObjectPool factory overload for pooled instance registration Add a new PooledInstancePerLifetimeScope(Func>) overload that accepts a factory delegate, allowing the ObjectPool to be resolved from the container at resolve time rather than created during registration. This enables custom pools (e.g. CacheObjectPool) to have their dependencies managed by Autofac DI. Key changes: - New DelegatingPooledRegistrationPolicy as pass-through policy for factory path - PoolActivator now supports factory constructor; branches at resolve time - IPooledComponent.OnReturnToPool() moved to PooledInstanceTracker.Dispose() so it fires regardless of pool implementation - RegistrationExtensions: 1 new public overload + 1 private RegisterPooled overload - 6 new tests covering factory registration, reuse, and lifecycle callbacks --- .../AutofacPooledObjectPolicy.cs | 5 - .../DelegatingPooledRegistrationPolicy.cs | 40 +++ src/Autofac.Pooling/PoolActivator.cs | 44 ++- src/Autofac.Pooling/PooledInstanceTracker.cs | 5 + src/Autofac.Pooling/RegistrationExtensions.cs | 160 +++++++++++ .../FactoryOverloadTests.cs | 253 ++++++++++++++++++ 6 files changed, 492 insertions(+), 15 deletions(-) create mode 100644 src/Autofac.Pooling/DelegatingPooledRegistrationPolicy.cs create mode 100644 test/Autofac.Pooling.Test/FactoryOverloadTests.cs diff --git a/src/Autofac.Pooling/AutofacPooledObjectPolicy.cs b/src/Autofac.Pooling/AutofacPooledObjectPolicy.cs index 8b202c4..ff88d0c 100644 --- a/src/Autofac.Pooling/AutofacPooledObjectPolicy.cs +++ b/src/Autofac.Pooling/AutofacPooledObjectPolicy.cs @@ -39,11 +39,6 @@ public TPooledObject Create() /// public bool Return(TPooledObject obj) { - if (obj is IPooledComponent poolAwareComponent) - { - poolAwareComponent.OnReturnToPool(); - } - if (_servicePolicy.Return(obj)) { return true; diff --git a/src/Autofac.Pooling/DelegatingPooledRegistrationPolicy.cs b/src/Autofac.Pooling/DelegatingPooledRegistrationPolicy.cs new file mode 100644 index 0000000..b5adcc6 --- /dev/null +++ b/src/Autofac.Pooling/DelegatingPooledRegistrationPolicy.cs @@ -0,0 +1,40 @@ +// Copyright (c) Autofac Project. All rights reserved. +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using System; +using System.Collections.Generic; +using Autofac.Core; + +namespace Autofac.Pooling; + +/// +/// A simple that delegates +/// to the +/// getFromPool callback, allowing the underlying +/// custom ObjectPool<T> to manage its own creation and +/// return behavior. Used when a custom pool is provided via a factory. +/// +/// The type of object being pooled. +internal sealed class DelegatingPooledRegistrationPolicy : IPooledRegistrationPolicy + where TPooledObject : class +{ + /// + public int MaximumRetained => int.MaxValue; + + /// + public TPooledObject Get(IComponentContext context, IEnumerable parameters, Func getFromPool) + { + if (getFromPool is null) + { + throw new ArgumentNullException(nameof(getFromPool)); + } + + return getFromPool(); + } + + /// + public bool Return(TPooledObject pooledObject) + { + return true; + } +} diff --git a/src/Autofac.Pooling/PoolActivator.cs b/src/Autofac.Pooling/PoolActivator.cs index 9a865dd..68171c2 100644 --- a/src/Autofac.Pooling/PoolActivator.cs +++ b/src/Autofac.Pooling/PoolActivator.cs @@ -15,12 +15,14 @@ namespace Autofac.Pooling; internal sealed class PoolActivator : IInstanceActivator where TLimit : class { - private readonly Service _pooledInstanceService; - private readonly IPooledRegistrationPolicy _policy; - private readonly DefaultObjectPoolProvider _poolProvider; + private readonly Service? _pooledInstanceService; + private readonly IPooledRegistrationPolicy? _policy; + private readonly DefaultObjectPoolProvider? _poolProvider; + private readonly Func>? _poolFactory; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class + /// using the default . /// /// The service used to resolve new instances of the pooled registration. /// The pool policy. @@ -34,6 +36,20 @@ public PoolActivator(Service pooledInstanceService, IPooledRegistrationPolicy + /// Initializes a new instance of the class + /// using a factory function to create the at resolve time. + /// + /// + /// A factory that returns the to use. + /// Invoked during resolve, so the is available + /// for resolving dependencies. + /// + public PoolActivator(Func> poolFactory) + { + _poolFactory = poolFactory ?? throw new ArgumentNullException(nameof(poolFactory)); + } + /// public Type LimitType { get; } = typeof(TLimit); @@ -42,15 +58,23 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic { pipelineBuilder.Use(PipelinePhase.Activation, (context, next) => { - // Get a reference to the actual lifetime scope. - var scope = context.Resolve(); + if (_poolFactory is not null) + { + // Custom factory: let the caller create the pool at resolve time. + context.Instance = _poolFactory(context); + } + else + { + // Default path: use DefaultObjectPoolProvider + AutofacPooledObjectPolicy. + var scope = context.Resolve(); - var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService, scope, _policy); + var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService!, scope, _policy!); - // The pool provider will create a disposable pool if the TLimit implements IDisposable. - var pool = _poolProvider.Create(poolPolicy); + // The pool provider will create a disposable pool if the TLimit implements IDisposable. + var pool = _poolProvider!.Create(poolPolicy); - context.Instance = pool; + context.Instance = pool; + } }); } diff --git a/src/Autofac.Pooling/PooledInstanceTracker.cs b/src/Autofac.Pooling/PooledInstanceTracker.cs index 0d423fa..ed1f7da 100644 --- a/src/Autofac.Pooling/PooledInstanceTracker.cs +++ b/src/Autofac.Pooling/PooledInstanceTracker.cs @@ -39,6 +39,11 @@ public TPooledObject Instance /// public void Dispose() { + if (Instance is IPooledComponent poolAwareComponent) + { + poolAwareComponent.OnReturnToPool(); + } + // Put the instance back in the pool. _pool.Return(Instance); } diff --git a/src/Autofac.Pooling/RegistrationExtensions.cs b/src/Autofac.Pooling/RegistrationExtensions.cs index 689c4f5..913e7f0 100644 --- a/src/Autofac.Pooling/RegistrationExtensions.cs +++ b/src/Autofac.Pooling/RegistrationExtensions.cs @@ -11,6 +11,7 @@ using Autofac.Core.Registration; using Autofac.Core.Resolving.Middleware; using Autofac.Core.Resolving.Pipeline; +using Microsoft.Extensions.ObjectPool; namespace Autofac.Pooling; @@ -138,6 +139,56 @@ public static IRegistrationBuilder + /// Configure the component so that every dependent component or manual resolve within a single + /// will return the same, shared instance, retrieved from a single pool of instances shared by all lifetime scopes. + /// When the scope ends, the instance will be returned to the pool. + /// + /// + /// + /// This method accepts a factory function that returns the to use. The factory is invoked + /// during resolve, so you may resolve dependencies from the (e.g. sp => sp.Resolve<ObjectPool<T>>()). + /// This allows the pool itself to be registered as a component and have its dependencies managed by the container. + /// + /// + /// + /// If the created by the factory implements , it will be disposed + /// when the container is disposed. Components implementing will still receive + /// and lifecycle notifications. + /// + /// + /// Registration limit type. + /// Activator data type. + /// Registration style. + /// The registration. + /// + /// A factory that returns the to use for this registration. + /// Invoked during resolve with access to the current . + /// + /// The registration builder. + public static IRegistrationBuilder + PooledInstancePerLifetimeScope( + this IRegistrationBuilder registration, + Func> poolFactory) + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class + { + if (registration == null) + { + throw new ArgumentNullException(nameof(registration)); + } + + if (poolFactory == null) + { + throw new ArgumentNullException(nameof(poolFactory)); + } + + RegisterPooled(registration, poolFactory, null); + + return registration; + } + /// /// Configure the component so that every dependent component or manual resolve within /// a tagged with any of the provided tags value gets the same, shared instance, @@ -378,4 +429,113 @@ private static void RegisterPooled( + IRegistrationBuilder registration, + Func> poolFactory, + object[]? tags) + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class + { + if (registration == null) + { + throw new ArgumentNullException(nameof(registration)); + } + + if (poolFactory == null) + { + throw new ArgumentNullException(nameof(poolFactory)); + } + + // Mark the lifetime appropriately. + var regData = registration.RegistrationData; + + regData.Lifetime = new PooledLifetime(); + regData.Sharing = InstanceSharing.None; + + var callback = regData.DeferredCallback ?? throw new NotSupportedException(RegistrationExtensionsResources.RequiresCallbackContainer); + + if (registration.ActivatorData.Activator is ProvidedInstanceActivator) + { + // Can't use provided instance activators with pooling (because it would try to repeatedly activate). + throw new NotSupportedException(RegistrationExtensionsResources.CannotUseProvidedInstances); + } + + var original = callback.Callback; + + Action newCallback = registry => + { + // Only do the additional registrations if we are still using a PooledLifetime. + if (!(regData.Lifetime is PooledLifetime)) + { + original(registry); + return; + } + + var pooledInstanceService = new UniqueService(); + + var instanceActivator = registration.ActivatorData.Activator; + + if (registration.ResolvePipeline.Middleware.Any(c => c is CoreEventMiddleware ev && ev.EventType == ResolveEventType.OnRelease)) + { + // OnRelease shouldn't be used with pooled instances, because if a policy chooses not to return them to the pool, + // the Disposal will be fired, not the OnRelease call; this means that OnRelease wouldn't fire until the container is disposed, + // which is not what we want. + throw new NotSupportedException(RegistrationExtensionsResources.OnReleaseNotSupported); + } + + // First, we going to create a pooled instance activator, that will be resolved when we want to + // **actually** resolve a new instance (during 'Create'). + // The instances themselves are owned by the pool, and will be disposed when the pool disposes + // (or when the instance is not returned to the pool). + var pooledInstanceRegistration = new ComponentRegistration( + Guid.NewGuid(), + instanceActivator, + RootScopeLifetime.Instance, + InstanceSharing.None, + InstanceOwnership.ExternallyOwned, + registration.ResolvePipeline, + new[] { pooledInstanceService }, + new Dictionary()); + + registry.Register(pooledInstanceRegistration); + + var poolService = new PoolService(pooledInstanceRegistration); + + var poolRegistration = new ComponentRegistration( + Guid.NewGuid(), + new PoolActivator(poolFactory), + RootScopeLifetime.Instance, + InstanceSharing.Shared, + InstanceOwnership.OwnedByLifetimeScope, + new[] { poolService }, + new Dictionary()); + + registry.Register(poolRegistration); + + var pooledGetLifetime = tags is null ? CurrentScopeLifetime.Instance : new MatchingScopeLifetime(tags); + + // Next, create a new registration with a custom activator, that copies metadata and services from + // the original registration. This registration will access the pool and return an instance from it. + var poolGetRegistration = new ComponentRegistration( + Guid.NewGuid(), + new PoolGetActivator(poolService, new DelegatingPooledRegistrationPolicy()), + pooledGetLifetime, + InstanceSharing.Shared, + InstanceOwnership.OwnedByLifetimeScope, + regData.Services, + regData.Metadata); + + registry.Register(poolGetRegistration); + + // Finally, add a service pipeline stage to just before the sharing middleware, for each supported service, to extract the pooled instance from the pool instance container. + foreach (var srv in regData.Services) + { + registry.RegisterServiceMiddleware(srv, new PooledInstanceUnpackMiddleware(), MiddlewareInsertionMode.StartOfPhase); + } + }; + + callback.Callback = newCallback; + } } diff --git a/test/Autofac.Pooling.Test/FactoryOverloadTests.cs b/test/Autofac.Pooling.Test/FactoryOverloadTests.cs new file mode 100644 index 0000000..cbb016b --- /dev/null +++ b/test/Autofac.Pooling.Test/FactoryOverloadTests.cs @@ -0,0 +1,253 @@ +// Copyright (c) Autofac Project. All rights reserved. +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using System.Collections.Generic; +using Autofac.Pooling.Tests.Common; +using Microsoft.Extensions.ObjectPool; +using Xunit; + +namespace Autofac.Pooling.Test; + +public class FactoryOverloadTests +{ + /// + /// A simple tracking pool that records how many instances it has created. + /// + private class TrackingObjectPool : ObjectPool + where T : class, new() + { + private readonly List _items = new(); + private readonly object _lock = new(); + + public int CreateCount { get; private set; } + + public override T Get() + { + lock (_lock) + { + if (_items.Count > 0) + { + var item = _items[^1]; + _items.RemoveAt(_items.Count - 1); + return item; + } + } + + CreateCount++; + return new T(); + } + + public override void Return(T obj) + { + lock (_lock) + { + _items.Add(obj); + } + } + + public void Clear() + { + lock (_lock) + { + _items.Clear(); + } + } + } + + [Fact] + public void FactoryOverload_RegistersAndResolves() + { + var builder = new ContainerBuilder(); + + // Register the pool as a component. + var trackingPool = new TrackingObjectPool(); + builder.RegisterInstance(trackingPool).As>(); + + builder.RegisterType() + .As() + .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + + var container = builder.Build(); + + using (var scope1 = container.BeginLifetimeScope()) + { + scope1.Resolve(); + } + + // Second scope reuses the instance from the pool. + using (var scope2 = container.BeginLifetimeScope()) + { + scope2.Resolve(); + } + + // Our custom pool was used, not the default one. + Assert.Equal(1, trackingPool.CreateCount); + + container.Dispose(); + } + + [Fact] + public void FactoryOverload_ResolveUsesProvidedPool() + { + var builder = new ContainerBuilder(); + + var trackingPool = new TrackingObjectPool(); + builder.RegisterInstance(trackingPool).As>(); + + builder.RegisterType() + .As() + .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + + var container = builder.Build(); + + using (var scope1 = container.BeginLifetimeScope()) + { + var instance = scope1.Resolve(); + Assert.NotNull(instance); + Assert.IsType(instance); + } + + container.Dispose(); + } + + [Fact] + public void FactoryOverload_WithIPooledComponent_OnReturnToPoolFires() + { + var builder = new ContainerBuilder(); + + var trackingPool = new TrackingObjectPool(); + builder.RegisterInstance(trackingPool).As>(); + + builder.RegisterType() + .As() + .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + + var container = builder.Build(); + + IPooledService instance; + + using (var scope1 = container.BeginLifetimeScope()) + { + instance = scope1.Resolve(); + Assert.Equal(1, instance.GetCalled); + } + + // OnReturnToPool should have been called when the scope ended. + Assert.Equal(1, instance.ReturnCalled); + + container.Dispose(); + } + + [Fact] + public void FactoryOverload_WithIPooledComponent_OnGetFromPoolFires() + { + var builder = new ContainerBuilder(); + + var trackingPool = new TrackingObjectPool(); + builder.RegisterInstance(trackingPool).As>(); + + builder.RegisterType() + .As() + .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + + var container = builder.Build(); + + using (var scope1 = container.BeginLifetimeScope()) + { + var instance = scope1.Resolve(); + Assert.Equal(1, instance.GetCalled); + + // Resolve again in the same scope - should get the same shared instance. + var instance2 = scope1.Resolve(); + Assert.Same(instance, instance2); + + // OnGetFromPool should only be called once per scope. + Assert.Equal(1, instance.GetCalled); + } + + container.Dispose(); + } + + [Fact] + public void FactoryOverload_MultipleScopesReusesInstance() + { + var builder = new ContainerBuilder(); + + var trackingPool = new TrackingObjectPool(); + builder.RegisterInstance(trackingPool).As>(); + + IPooledService capturedInstance = null!; + + builder.RegisterType() + .As() + .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + + var container = builder.Build(); + + // First scope - resolves a new instance. + using (var scope1 = container.BeginLifetimeScope()) + { + capturedInstance = scope1.Resolve(); + Assert.Equal(1, capturedInstance.GetCalled); + } + + // Instance returned to pool; OnReturnToPool should have fired. + Assert.Equal(1, capturedInstance.ReturnCalled); + + // Second scope - should get same instance from pool. + using (var scope2 = container.BeginLifetimeScope()) + { + var instance2 = scope2.Resolve(); + Assert.Same(capturedInstance, instance2); + + // OnGetFromPool should fire again on second scope. + Assert.Equal(2, instance2.GetCalled); + } + + // OnReturnToPool should fire again on second scope. + Assert.Equal(2, capturedInstance.ReturnCalled); + + // Still only 1 instance created by the pool. + Assert.Equal(1, trackingPool.CreateCount); + + container.Dispose(); + } + + [Fact] + public void FactoryOverload_PoolFactoryReceivesComponentContext() + { + var builder = new ContainerBuilder(); + + // Register a dependency that the pool factory can resolve. + var poolSize = new PoolConfig { Size = 42 }; + builder.RegisterInstance(poolSize); + + var factoryCalled = false; + + builder.RegisterType() + .As() + .PooledInstancePerLifetimeScope(sp => + { + factoryCalled = true; + var config = sp.Resolve(); + Assert.Equal(42, config.Size); + return new DefaultObjectPool(new DefaultPooledObjectPolicy(), config.Size); + }); + + var container = builder.Build(); + + using (var scope = container.BeginLifetimeScope()) + { + scope.Resolve(); + } + + Assert.True(factoryCalled); + + container.Dispose(); + } + + private class PoolConfig + { + public int Size { get; set; } + } +} From 596999ebe64b3ab9d3cdae02723f4b4e05201169 Mon Sep 17 00:00:00 2001 From: "1622989459@qq.com" <1622989459@qq.com> Date: Sun, 14 Jun 2026 09:09:50 +0800 Subject: [PATCH 02/10] Add metadata-based pool/strategy configuration with type-safe builder --- .../1781355787144-8bb67aba-run_command.txt | 171 +++++++++++ .../1781356494407-a7427901-run_command.txt | 182 +++++++++++ .../1781364619590-92d833a4-run_command.txt | 146 +++++++++ .../1781365172382-60503cc2-run_command.txt | 146 +++++++++ .../1781366837259-1fb20d98-run_command.txt | 141 +++++++++ cache.sqlite.db | Bin 0 -> 16384 bytes cache.sqlite.db-shm | Bin 0 -> 32768 bytes cache.sqlite.db-wal | Bin 0 -> 16512 bytes .../IPooledRegistrationBuilder.cs | 24 ++ src/Autofac.Pooling/PoolActivator.cs | 75 ++++- src/Autofac.Pooling/PoolGetActivator.cs | 23 +- .../PooledRegistrationBuilder.cs | 31 ++ src/Autofac.Pooling/RegistrationExtensions.cs | 285 ++++++++++++++++++ .../StrategyFactoryOverloadTests.cs | 163 ++++++++++ 14 files changed, 1374 insertions(+), 13 deletions(-) create mode 100644 .reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt create mode 100644 .reasonix/truncated-results/1781356494407-a7427901-run_command.txt create mode 100644 .reasonix/truncated-results/1781364619590-92d833a4-run_command.txt create mode 100644 .reasonix/truncated-results/1781365172382-60503cc2-run_command.txt create mode 100644 .reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt create mode 100644 cache.sqlite.db create mode 100644 cache.sqlite.db-shm create mode 100644 cache.sqlite.db-wal create mode 100644 src/Autofac.Pooling/IPooledRegistrationBuilder.cs create mode 100644 src/Autofac.Pooling/PooledRegistrationBuilder.cs create mode 100644 test/Autofac.Pooling.Test/StrategyFactoryOverloadTests.cs diff --git a/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt b/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt new file mode 100644 index 0000000..dfc69a5 --- /dev/null +++ b/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt @@ -0,0 +1,171 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔══════════════════════════════════════╗ +║ 🎮 Autofac.KeyedResilience Demo ║ +║ HybridCache: FusionCache + SQLite ║ +╚══════════════════════════════════════╝ + +info: NeoSmart.Caching.Sqlite.SqliteCache[0] + Initializing db cache: Data Source=cache.sqlite.db;Mode=ReadWriteCreate;Cache=Shared +─── 演示 1: 从对象池取 Monster ─── +info: Program[0] + 池化怪物: 池化怪物 (Lv.1) + +─── 演示 2: Lazy> ─── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLJ K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLJ K=monsters:all): GetOrDefaultAsync return (default value) + 📂 执行 JSON 加载… +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLK K=monsters:all): SetAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] + +─── 演示 3: Polly 管道(内部 HybridCache → FusionCache → SQLite) ─── +info: Program[0] + Lazy 加载: 毒蘑菇 (Lv.2, 毒) +info: Program[0] + ──── 第 1 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] + +info: Program[0] + 🐉 结果: [mon-007] 毒蘑菇 Lv.2 毒 +info: Program[0] + ──── 第 2 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 🐉 结果: [mon-008] 岩石傀儡 Lv.8 地 + +info: Program[0] + ──── 第 3 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] + +info: Program[0] + 🐉 结果: [mon-002] 火焰精灵 Lv.3 火 +info: Program[0] + ──── 第 4 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 🐉 结果: [mon-002] 火焰精灵 Lv.3 火 + +info: Program[0] + ──── 第 5 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 🐉 结果: [mon-008] 岩石傀儡 Lv.8 地 + +─── 演示 4: 缓存验证 ─── +info: Program[0] + ──── 第 1 次调用 GetMonstersAsync ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 📦 拿到 10 个怪物 +info: Program[0] + ──── 第 2 次调用 GetMonstersAsync ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 📦 拿到 10 个怪物 +info: Program[0] + ──── 第 3 次调用 GetMonstersAsync ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 📦 拿到 10 个怪物 + +─── 演示 5: 池化对象复用 ─── +info: Program[0] + 取出: 池化怪物 +info: Program[0] + 已归还 +info: Program[0] + 再次取出: 池化怪物 + +info: Program[0] + 是否同一个对象: True +🏁 演示结束 diff --git a/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt b/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt new file mode 100644 index 0000000..1594764 --- /dev/null +++ b/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt @@ -0,0 +1,182 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔══════════════════════════════════════╗ +║ 🎮 Autofac.KeyedResilience Demo ║ +║ HybridCache: FusionCache + SQLite ║ +╚══════════════════════════════════════╝ + +─── 演示 1: 怪物池化复用 ─── + +─── 演示 2: Lazy 延迟 Spawn ─── +info: Program[0] + 从池取出空壳 Monster,对象 ID: 17230008 +info: Program[0] + 怪物死亡,归还到池 +info: Program[0] + 新怪物出生,从池取出: 是否同一实例 = True +info: Program[0] + Lazy 还没生成… +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2ST K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2ST K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +─── 演示 3: 批量 Spawn 5 只怪物 ─── + 每个怪物从池取空壳 → 填充随机模板 → 出场 +info: Program[0] + ⚔️ 怪物出场: 雷狼龙 (Lv.4, 雷) +info: Program[0] + ──── 第 1 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +info: Program[0] + 🐉 [mon-010] 混沌魔王 Lv.12 混沌 ♥200 ⚔30 +info: Program[0] + 💀 怪物死亡,归还到池 +info: Program[0] + ──── 第 2 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +info: Program[0] + 🐉 [mon-006] 圣光骑士 Lv.7 光 ♥90 ⚔14 +info: Program[0] + 💀 怪物死亡,归还到池 +info: Program[0] + ──── 第 3 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-007] 毒蘑菇 Lv.2 毒 ♥25 ⚔7 + +info: Program[0] + 💀 怪物死亡,归还到池 +info: Program[0] + ──── 第 4 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-003] 冰霜巨人 Lv.5 冰 ♥80 ⚔8 + +info: Program[0] + 💀 怪物死亡,归还到池 +info: Program[0] + ──── 第 5 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-003] 冰霜巨人 Lv.5 冰 ♥80 ⚔8 + +info: Program[0] + 💀 怪物死亡,归还到池 +─── 演示 4: 怪物模板缓存验证 ─── +info: Program[0] + ──── 第 1 次读取怪物模板 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TD K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TE K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TE K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TF K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TF K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TD K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 📖 拿到了 10 种怪物模板 +info: Program[0] + ──── 第 2 次读取怪物模板 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TG K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TH K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TH K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TI K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TI K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TG K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 📖 拿到了 10 种怪物模板 +info: Program[0] + ──── 第 3 次读取怪物模板 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TJ K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TK K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TK K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TL K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TL K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TJ K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + 📂 JSON 只加载了一次,后续全部走 HybridCache → FusionCache → SQLite +info: Program[0] + 📖 拿到了 10 种怪物模板 + +🏁 演示结束 diff --git a/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt b/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt new file mode 100644 index 0000000..9a3cf49 --- /dev/null +++ b/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt @@ -0,0 +1,146 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔═══════════════════════════════════╗ +║ Autofac.KeyedResilience Demo ║ +║ FusionCache + SQLite + Polly ║ +╚═══════════════════════════════════╝ + +info: Program[0] + === 1. Lazy 延迟生成 === +info: Program[0] + Lazy 创建了,还没执行… +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL6 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL7 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL7 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL8 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL8 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL6 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + ⚔️ 风暴巨龙 Lv.10 风 + +info: Program[0] + === 2. 批量生成(缓存模板数据) === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL9 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULA K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULA K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULB K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULB K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL9 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-007] 毒蘑菇 Lv.2 ♥25 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULC K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULD K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULD K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULE K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULE K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULC K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-010] 混沌魔王 Lv.12 ♥200 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULF K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULG K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULG K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULH K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULH K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULF K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULI K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULJ K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULJ K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULK K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULK K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULI K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-004] 雷狼龙 Lv.4 ♥50 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +info: Program[0] + 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 +info: Program[0] + === 3. 缓存验证 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 1 次 → 10 种模板 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 2 次 → 10 种模板 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUM0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUM0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +(JSON 只加载一次,后续全部走 HybridCache → FusionCache → SQLite) + +🏁 完成 +info: Program[0] + 第 3 次 → 10 种模板 diff --git a/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt b/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt new file mode 100644 index 0000000..025b011 --- /dev/null +++ b/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt @@ -0,0 +1,146 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔═══════════════════════════════════╗ +║ Autofac.KeyedResilience Demo ║ +║ FusionCache + SQLite + Polly ║ +╚═══════════════════════════════════╝ + +info: Program[0] + === 1. Lazy 延迟生成 === +info: Program[0] + Lazy 已创建,尚未执行… +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNC K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKND K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKND K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNE K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNE K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNC K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + ⚔️ 岩石傀儡 Lv.8 地 + +info: Program[0] + === 2. 批量生成 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNF K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNG K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNG K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNH K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNH K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNF K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-010] 混沌魔王 Lv.12 ♥200 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNI K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNJ K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNJ K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNK K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNK K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNI K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-007] 毒蘑菇 Lv.2 ♥25 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-004] 雷狼龙 Lv.4 ♥50 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-002] 火焰精灵 Lv.3 ♥35 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +info: Program[0] + 🐉 [mon-005] 暗影刺客 Lv.6 ♥40 +info: Program[0] + === 3. 缓存验证 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 1 次 → 10 种模板 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 2 次 → 10 种模板 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +(JSON 只加载一次,后续 HybridCache → FusionCache → SQLite) +info: Program[0] + 第 3 次 → 10 种模板 + +🏁 完成 diff --git a/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt b/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt new file mode 100644 index 0000000..7a19895 --- /dev/null +++ b/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt @@ -0,0 +1,141 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔═══════════════════════════════════╗ +║ Autofac.KeyedResilience Demo ║ +║ FusionCache + SQLite + Polly ║ +╚═══════════════════════════════════╝ + +info: Program[0] + === 1. Lazy 延迟生成 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + ⚔️ 岩石傀儡 Lv.8 +info: Program[0] + === 2. 批量生成 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-001] 史莱姆 Lv.1 ♥20 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PER K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PES K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PES K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PET K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PET K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PER K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-001] 史莱姆 Lv.1 ♥20 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-008] 岩石傀儡 Lv.8 ♥120 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-002] 火焰精灵 Lv.3 ♥35 +info: Program[0] + === 3. 缓存验证 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 1 次 → 模板已缓存 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 2 次 → 模板已缓存 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFD K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFE K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFE K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFF K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFF K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFD K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +🏁 完成 +info: Program[0] + 第 3 次 → 模板已缓存 diff --git a/cache.sqlite.db b/cache.sqlite.db new file mode 100644 index 0000000000000000000000000000000000000000..5847ff116ae3495cb18ff1087ae1b2f12d607a51 GIT binary patch literal 16384 zcmeI%&q~8E90%~U6}1KJ5Tu6*hJdhvc<}|?v}m!mS}V?jNbDjG_eX0tHxGh7f^X$Z zco2L9@21@b6-4k_zJdH{(){^-$ffl7$ZaKpUiIP*Pv|Bo5mhByloCQznP+64CQUZ- z&&qV*k6I-gk9Q051#R(_nCFY1vO^ZaeyiIQ z!-z-M;zA5>Tk$As&uj;FEwriQ?br><^5cy9-lT`oilMXdG-gx>>YTN_tUUV(zif++ zNO+pH$x>mh?%I^4UE_H-V#M^&ZiLkHWj=A;b-CJrxBG(Wju+ayb|8BW1LvR?oY8&z ztisYcRijEzop8@T32ES;Iy=u)nX@cQd0EXi&JLRu>d&pSzTDme9!J+a{%!lZ>(|rM zOk&F&hsB~R9(enIM>NtqS4s;c2tWV=5P$##AOHafKmY;|fB*!FDv*BvtL6tWKg_S9 z#)!Be009U<00Izz00bZa0SG_<0>u|t(#o?@EO;WC^Y3r&%2V&t(8~Hi#P_XU7yti@ ae*+L91Rwwb2tWV=5P$##AOHafK;Rpo%Y2;x literal 0 HcmV?d00001 diff --git a/cache.sqlite.db-shm b/cache.sqlite.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..8f39ffd99a7f5a2cce20b73256cf89ad4ed35a60 GIT binary patch literal 32768 zcmeI)p$!5t6b9gOKtLkTVj*~Pt1t~?kf5=*0E!V11cSlhSb#t)n$#kp-=8#To2D=C z8{oC~Rmd5HFdN0gIIi>baa!!UTl3mZ_M7>2*&m*lb$@KXe4qbL|GtZq_h}z%hbFFE zKivrd0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!Cu%3#6$NLZD88G;c)+5FkLHE`ecP?dq05A&{ob z2>}8G2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly IK;Sn7J}Rgv6951J literal 0 HcmV?d00001 diff --git a/cache.sqlite.db-wal b/cache.sqlite.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..71a986e74386ac47dcafcd2dad2bb02eb460d46d GIT binary patch literal 16512 zcmeI2&u`mg7{{GtYiXr*AW;Qz!MqaEN;Bjid0*SPFxzohMAon_`$bz#ruDW^HyvqG zHl{IkoDkx|4TN?=;&0%}nG*;JBz6GQ1KJLpk&t*E$8p~{yKqE2R^r(2kLUTmpZ9$u zlND{(Ug}<=V?X{nAwy4%&n8ojBTw1|hynX{e6twE~r4 z(Wu{cbcfA#f-4<$r48?ktyTr1?T7I&Vsp)vPVh#s3MFr?HqW`MSJgLztEU+DS(;x` zFE=}9+ZQ|PYWs4texMd+%jI(6!AnWvL~L>@PNq)Eq}=;qfAeP8e_DF4)%H+LIyOlT z>qoul{V@J_5&?J-m)+Pe`1t4F&;0fEhu_UZSz+Nh1zvOz0U|&IhyW2F0z`la5CI}U z1c<=@iNL4zndL9uo>BIV+RkooZxHqOYGEATWtWoQ#kIA&thvQ%3@T4+n$9Y01%72i z!TOM!4P$+1o1PBWjxV6D741hctLYVX_76A}zrf~5&>eQ4>X24~-cK9*+jBO&HU zhzZ%pLUhQUDXC5>!EiYxX@;t1LItMsO-vG4Q^K&p5gXkDNe(oJVblYAeOL`V_edBB zLPEAg$d+{JP%k6m5H2SSiy#9xs)?}CEu5!`VFMHf%NqapPyXv4`vN~cet7NOhfku! z7dUySz>5wdKm>>Y5g-CYfCvx)B0vO)01+SpMBu+n;KkC+@`=}%KRJB<&u?;m4-5;v zf#YLe;M+f*`TkMu^H*`WiAm##h6Tol(EvlkX*kZ2l>r_KS{YojGSI%rJQgu&WniG3 zm668gCdUj0+9cqbRBeIhAeeGm(BR3O79kuE#v2y8P=@Kk*>lk(O1&sZkMgRLJoKe9 zd0-LAP78+1$+I;dT^xv=2y=u3#)}=e(@qOoV3{y(8DJH0z3Kol*Fkx9fc8=<%o+)E zBw;$R%!Hv)B`d>7Ib~@IgQG78u9@$F8zywkoetPL6dFzSeI&ol!B@>Zn;2hfri%|%#3ayiHlUo5L zB|7EJV91*RTgW;wB4m)gPYj7-ELhfQHTrx3tZXaUBD|^tAfbsyUagK}&eV!JZdu{m zxMe*Knl00o79cLLWVSUBHMU1hxX$J~Z$lnM%xNBNLMN!hin0t1Hm+^^xHjO{wLrPU z8<1ZZqK^C;qblL~*j^KL7|2G2b-Fvz9z4VaGc8O<7hrC3Ti7;Ej00<7_eOU!j01dX zEF5%qds2IcS2@h-MEg#71MKA9Fpewi96SZK6~dEX$^E_Yw;+DK(Ln@=01+SpM1Tko M0U|&Ih(Jo +/// A builder for configuring a pooled registration, returned by . +/// +/// Registration limit type. +/// Activator data type. +/// Registration style. +public interface IPooledRegistrationBuilder + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class +{ + /// + /// Gets the registration data for the pooled registration. + /// + RegistrationData RegistrationData { get; } +} diff --git a/src/Autofac.Pooling/PoolActivator.cs b/src/Autofac.Pooling/PoolActivator.cs index 9a865dd..f85132d 100644 --- a/src/Autofac.Pooling/PoolActivator.cs +++ b/src/Autofac.Pooling/PoolActivator.cs @@ -15,12 +15,15 @@ namespace Autofac.Pooling; internal sealed class PoolActivator : IInstanceActivator where TLimit : class { - private readonly Service _pooledInstanceService; - private readonly IPooledRegistrationPolicy _policy; - private readonly DefaultObjectPoolProvider _poolProvider; + private readonly Service? _pooledInstanceService; + private readonly IPooledRegistrationPolicy? _policy; + private readonly DefaultObjectPoolProvider? _poolProvider; + private readonly Func>? _poolFactory; + private readonly Func>? _policyFactory; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class + /// using the default . /// /// The service used to resolve new instances of the pooled registration. /// The pool policy. @@ -34,6 +37,37 @@ public PoolActivator(Service pooledInstanceService, IPooledRegistrationPolicy + /// Initializes a new instance of the class + /// using a factory function to create the at resolve time. + /// + /// + /// A factory that returns the to use. + /// Invoked during resolve, so the is available + /// for resolving dependencies. + /// + public PoolActivator(Func> poolFactory) + { + _poolFactory = poolFactory ?? throw new ArgumentNullException(nameof(poolFactory)); + } + + /// + /// Initializes a new instance of the class + /// using a factory function to create the at resolve time. + /// The default will create the backing pool. + /// + /// The service used to resolve new instances of the pooled registration. + /// + /// A factory that returns the to use. + /// Invoked during resolve, so the is available + /// for resolving dependencies. + /// + public PoolActivator(Service pooledInstanceService, Func> policyFactory) + { + _pooledInstanceService = pooledInstanceService; + _policyFactory = policyFactory ?? throw new ArgumentNullException(nameof(policyFactory)); + } + /// public Type LimitType { get; } = typeof(TLimit); @@ -42,15 +76,36 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic { pipelineBuilder.Use(PipelinePhase.Activation, (context, next) => { - // Get a reference to the actual lifetime scope. - var scope = context.Resolve(); + if (_poolFactory is not null) + { + // Custom pool factory: let the caller create the pool at resolve time. + context.Instance = _poolFactory(context); + } + else if (_policyFactory is not null) + { + // Custom policy factory: resolve the strategy at resolve time, then create DefaultObjectPool. + var policy = _policyFactory(context); + var poolProvider = new DefaultObjectPoolProvider + { + MaximumRetained = policy.MaximumRetained, + }; + var scope = context.Resolve(); + var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService!, scope, policy); + var pool = poolProvider.Create(poolPolicy); + context.Instance = pool; + } + else + { + // Default path: use DefaultObjectPoolProvider + AutofacPooledObjectPolicy. + var scope = context.Resolve(); - var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService, scope, _policy); + var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService!, scope, _policy!); - // The pool provider will create a disposable pool if the TLimit implements IDisposable. - var pool = _poolProvider.Create(poolPolicy); + // The pool provider will create a disposable pool if the TLimit implements IDisposable. + var pool = _poolProvider!.Create(poolPolicy); - context.Instance = pool; + context.Instance = pool; + } }); } diff --git a/src/Autofac.Pooling/PoolGetActivator.cs b/src/Autofac.Pooling/PoolGetActivator.cs index 4bfad02..91b6490 100644 --- a/src/Autofac.Pooling/PoolGetActivator.cs +++ b/src/Autofac.Pooling/PoolGetActivator.cs @@ -17,7 +17,8 @@ internal sealed class PoolGetActivator : IInstanceActivator where TLimit : class { private readonly PoolService _poolService; - private readonly IPooledRegistrationPolicy _registrationPolicy; + private readonly IPooledRegistrationPolicy? _registrationPolicy; + private readonly Func>? _policyFactory; /// /// Initializes a new instance of the class. @@ -30,6 +31,21 @@ public PoolGetActivator(PoolService poolService, IPooledRegistrationPolicy + /// Initializes a new instance of the class + /// with a factory that resolves the policy at resolve time. + /// + /// The service used to access the pool. + /// + /// A factory that returns the to use. + /// Invoked during resolve with access to the current . + /// + public PoolGetActivator(PoolService poolService, Func> policyFactory) + { + _poolService = poolService; + _policyFactory = policyFactory ?? throw new ArgumentNullException(nameof(policyFactory)); + } + /// public Type LimitType { get; } = typeof(TLimit); @@ -39,6 +55,7 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic pipelineBuilder.Use(PipelinePhase.Activation, (ctxt, next) => { var pool = (ObjectPool)ctxt.ResolveService(_poolService); + var policy = _policyFactory?.Invoke(ctxt) ?? _registrationPolicy!; var didGetFromPool = false; TLimit PoolGet() @@ -47,11 +64,11 @@ TLimit PoolGet() return pool.Get(); } - var poolItem = _registrationPolicy.Get(ctxt, ctxt.Parameters, PoolGet) ?? throw new InvalidOperationException( + var poolItem = policy.Get(ctxt, ctxt.Parameters, PoolGet) ?? throw new InvalidOperationException( string.Format( CultureInfo.CurrentCulture, PoolGetActivatorResources.PolicyMustReturnInstance, - _registrationPolicy.GetType().FullName, + policy.GetType().FullName, typeof(TLimit).FullName)); if (didGetFromPool) diff --git a/src/Autofac.Pooling/PooledRegistrationBuilder.cs b/src/Autofac.Pooling/PooledRegistrationBuilder.cs new file mode 100644 index 0000000..72d6531 --- /dev/null +++ b/src/Autofac.Pooling/PooledRegistrationBuilder.cs @@ -0,0 +1,31 @@ +// Copyright (c) Autofac Project. All rights reserved. +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using System; +using Autofac.Builder; +using Autofac.Core; + +namespace Autofac.Pooling; + +/// +/// Internal implementation of . +/// +internal sealed class PooledRegistrationBuilder + : IPooledRegistrationBuilder + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class +{ + /// + /// Initializes a new instance of the class. + /// + /// The underlying registration builder. + public PooledRegistrationBuilder(IRegistrationBuilder registration) + { + if (registration is null) throw new ArgumentNullException(nameof(registration)); + RegistrationData = registration.RegistrationData; + } + + /// + public RegistrationData RegistrationData { get; } +} diff --git a/src/Autofac.Pooling/RegistrationExtensions.cs b/src/Autofac.Pooling/RegistrationExtensions.cs index 689c4f5..76a040f 100644 --- a/src/Autofac.Pooling/RegistrationExtensions.cs +++ b/src/Autofac.Pooling/RegistrationExtensions.cs @@ -11,6 +11,7 @@ using Autofac.Core.Registration; using Autofac.Core.Resolving.Middleware; using Autofac.Core.Resolving.Pipeline; +using Microsoft.Extensions.ObjectPool; namespace Autofac.Pooling; @@ -138,6 +139,154 @@ public static IRegistrationBuilder + /// Configure the component with a custom pool factory. Must be followed by . + /// + /// Registration limit type. + /// Activator data type. + /// Registration style. + /// The registration. + /// A factory that returns the to use. + /// The registration builder for chaining. + /// + /// Configure the component so that every dependent component or manual resolve within a single + /// will return the same, shared instance, retrieved from a pool of instances shared by all lifetime scopes. + /// When the scope ends, the instance will be returned to the pool. + /// Returns an + /// for further configuration via + /// and . + /// When no additional configuration is provided, defaults apply. + /// + /// Registration limit type. + /// Activator data type. + /// Registration style. + /// The registration. + /// A pooled registration builder for further configuration. + public static IPooledRegistrationBuilder + PooledPerLifetimeScope( + this IRegistrationBuilder registration) + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class + { + if (registration == null) throw new ArgumentNullException(nameof(registration)); + + // Lazy routing: defer to registry build time, when Metadata is populated. + var regData = registration.RegistrationData; + regData.Lifetime = new PooledLifetime(); + regData.Sharing = InstanceSharing.None; + + var callback = regData.DeferredCallback + ?? throw new NotSupportedException(RegistrationExtensionsResources.RequiresCallbackContainer); + + if (registration.ActivatorData.Activator is ProvidedInstanceActivator) + throw new NotSupportedException(RegistrationExtensionsResources.CannotUseProvidedInstances); + + var original = callback.Callback; + callback.Callback = registry => + { + if (!(regData.Lifetime is PooledLifetime)) { original(registry); return; } + + // Begin: inlined from RegisterPooled(IPooledRegistrationPolicy) + if (registration.ResolvePipeline.Middleware.Any(c => c is CoreEventMiddleware ev && ev.EventType == ResolveEventType.OnRelease)) + throw new NotSupportedException(RegistrationExtensionsResources.OnReleaseNotSupported); + + var pooledInstanceService = new UniqueService(); + var instanceActivator = registration.ActivatorData.Activator; + + var pooledInstanceRegistration = new ComponentRegistration( + Guid.NewGuid(), instanceActivator, RootScopeLifetime.Instance, + InstanceSharing.None, InstanceOwnership.ExternallyOwned, + registration.ResolvePipeline, + new[] { pooledInstanceService }, + new Dictionary()); + registry.Register(pooledInstanceRegistration); + + var poolService = new PoolService(pooledInstanceRegistration); + + var pf = regData.Metadata.TryGetValue("PoolFactory", out var pv) + ? pv as Func> + : null; + var sf = regData.Metadata.TryGetValue("StrategyFactory", out var sv) + ? sv as Func> + : null; + + if (pf is not null && sf is not null) + { + registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolActivator(pf), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, new[] { poolService }, new Dictionary())); + registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolGetActivator(poolService, sf), CurrentScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, regData.Services, regData.Metadata)); + } + else if (sf is not null) + { + registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolActivator(pooledInstanceService, sf), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, new[] { poolService }, new Dictionary())); + registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolGetActivator(poolService, sf), CurrentScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, regData.Services, regData.Metadata)); + } + else if (pf is not null) + { + registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolActivator(pf), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, new[] { poolService }, new Dictionary())); + registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolGetActivator(poolService, static _ => new DefaultPooledRegistrationPolicy()), CurrentScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, regData.Services, regData.Metadata)); + } + else + { + registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolActivator(pooledInstanceService, new DefaultPooledRegistrationPolicy()), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, new[] { poolService }, new Dictionary())); + registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolGetActivator(poolService, new DefaultPooledRegistrationPolicy()), CurrentScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, regData.Services, regData.Metadata)); + } + + foreach (var srv in regData.Services) + registry.RegisterServiceMiddleware(srv, new PooledInstanceUnpackMiddleware(), MiddlewareInsertionMode.StartOfPhase); + }; + + return new PooledRegistrationBuilder(registration); + } + + /// + /// Sets a custom pool factory on a pooled registration. Must follow . + /// When set, and are controlled by the provided pool. + /// + /// Registration limit type. + /// Activator data type. + /// Registration style. + /// The pooled registration builder. + /// A factory that returns the to use. + /// The pooled registration builder for chaining. + public static IPooledRegistrationBuilder + ConfigurePool( + this IPooledRegistrationBuilder builder, + Func> poolFactory) + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class + { + if (builder == null) throw new ArgumentNullException(nameof(builder)); + if (poolFactory == null) throw new ArgumentNullException(nameof(poolFactory)); + builder.RegistrationData.Metadata["PoolFactory"] = poolFactory; + return builder; + } + + /// + /// Sets a custom strategy factory on a pooled registration. Must follow . + /// When set, the strategy's receives full context at resolve time. + /// + /// Registration limit type. + /// Activator data type. + /// Registration style. + /// The pooled registration builder. + /// A factory that returns the to use. + /// The pooled registration builder for chaining. + public static IPooledRegistrationBuilder + ConfigureStrategy( + this IPooledRegistrationBuilder builder, + Func> strategyFactory) + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class + { + if (builder == null) throw new ArgumentNullException(nameof(builder)); + if (strategyFactory == null) throw new ArgumentNullException(nameof(strategyFactory)); + builder.RegistrationData.Metadata["StrategyFactory"] = strategyFactory; + return builder; + } + /// /// Configure the component so that every dependent component or manual resolve within /// a tagged with any of the provided tags value gets the same, shared instance, @@ -378,4 +527,140 @@ private static void RegisterPooled( + IRegistrationBuilder registration, + Func> policyFactory, + object[]? tags) + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class + { + if (registration == null) throw new ArgumentNullException(nameof(registration)); + if (policyFactory == null) throw new ArgumentNullException(nameof(policyFactory)); + + var regData = registration.RegistrationData; + regData.Lifetime = new PooledLifetime(); + regData.Sharing = InstanceSharing.None; + + var callback = regData.DeferredCallback ?? throw new NotSupportedException(RegistrationExtensionsResources.RequiresCallbackContainer); + if (registration.ActivatorData.Activator is ProvidedInstanceActivator) throw new NotSupportedException(RegistrationExtensionsResources.CannotUseProvidedInstances); + + var original = callback.Callback; + callback.Callback = registry => + { + if (!(regData.Lifetime is PooledLifetime)) { original(registry); return; } + + var pooledInstanceService = new UniqueService(); + var instanceActivator = registration.ActivatorData.Activator; + + if (registration.ResolvePipeline.Middleware.Any(c => c is CoreEventMiddleware ev && ev.EventType == ResolveEventType.OnRelease)) + { + throw new NotSupportedException(RegistrationExtensionsResources.OnReleaseNotSupported); + } + + var pooledInstanceRegistration = new ComponentRegistration( + Guid.NewGuid(), instanceActivator, RootScopeLifetime.Instance, + InstanceSharing.None, InstanceOwnership.ExternallyOwned, + registration.ResolvePipeline, + new[] { pooledInstanceService }, + new Dictionary()); + registry.Register(pooledInstanceRegistration); + + var poolService = new PoolService(pooledInstanceRegistration); + + registry.Register(new ComponentRegistration( + Guid.NewGuid(), + new PoolActivator(pooledInstanceService, policyFactory), + RootScopeLifetime.Instance, InstanceSharing.Shared, + InstanceOwnership.OwnedByLifetimeScope, + new[] { poolService }, + new Dictionary())); + + var pooledGetLifetime = tags is null + ? CurrentScopeLifetime.Instance + : new MatchingScopeLifetime(tags); + + registry.Register(new ComponentRegistration( + Guid.NewGuid(), + new PoolGetActivator(poolService, policyFactory), + pooledGetLifetime, InstanceSharing.Shared, + InstanceOwnership.OwnedByLifetimeScope, + regData.Services, regData.Metadata)); + + foreach (var srv in regData.Services) + { + registry.RegisterServiceMiddleware(srv, new PooledInstanceUnpackMiddleware(), MiddlewareInsertionMode.StartOfPhase); + } + }; + } + + private static void RegisterPooled( + IRegistrationBuilder registration, + Func> poolFactory, + Func> strategyFactory, + object[]? tags) + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class + { + if (registration == null) throw new ArgumentNullException(nameof(registration)); + if (poolFactory == null) throw new ArgumentNullException(nameof(poolFactory)); + if (strategyFactory == null) throw new ArgumentNullException(nameof(strategyFactory)); + + var regData = registration.RegistrationData; + regData.Lifetime = new PooledLifetime(); + regData.Sharing = InstanceSharing.None; + + var callback = regData.DeferredCallback ?? throw new NotSupportedException(RegistrationExtensionsResources.RequiresCallbackContainer); + if (registration.ActivatorData.Activator is ProvidedInstanceActivator) throw new NotSupportedException(RegistrationExtensionsResources.CannotUseProvidedInstances); + + var original = callback.Callback; + callback.Callback = registry => + { + if (!(regData.Lifetime is PooledLifetime)) { original(registry); return; } + + var pooledInstanceService = new UniqueService(); + var instanceActivator = registration.ActivatorData.Activator; + + if (registration.ResolvePipeline.Middleware.Any(c => c is CoreEventMiddleware ev && ev.EventType == ResolveEventType.OnRelease)) + { + throw new NotSupportedException(RegistrationExtensionsResources.OnReleaseNotSupported); + } + + var pooledInstanceRegistration = new ComponentRegistration( + Guid.NewGuid(), instanceActivator, RootScopeLifetime.Instance, + InstanceSharing.None, InstanceOwnership.ExternallyOwned, + registration.ResolvePipeline, + new[] { pooledInstanceService }, + new Dictionary()); + registry.Register(pooledInstanceRegistration); + + var poolService = new PoolService(pooledInstanceRegistration); + + registry.Register(new ComponentRegistration( + Guid.NewGuid(), + new PoolActivator(poolFactory), + RootScopeLifetime.Instance, InstanceSharing.Shared, + InstanceOwnership.OwnedByLifetimeScope, + new[] { poolService }, + new Dictionary())); + + var pooledGetLifetime = tags is null + ? CurrentScopeLifetime.Instance + : new MatchingScopeLifetime(tags); + + registry.Register(new ComponentRegistration( + Guid.NewGuid(), + new PoolGetActivator(poolService, strategyFactory), + pooledGetLifetime, InstanceSharing.Shared, + InstanceOwnership.OwnedByLifetimeScope, + regData.Services, regData.Metadata)); + + foreach (var srv in regData.Services) + { + registry.RegisterServiceMiddleware(srv, new PooledInstanceUnpackMiddleware(), MiddlewareInsertionMode.StartOfPhase); + } + }; + } } diff --git a/test/Autofac.Pooling.Test/StrategyFactoryOverloadTests.cs b/test/Autofac.Pooling.Test/StrategyFactoryOverloadTests.cs new file mode 100644 index 0000000..d86aa5b --- /dev/null +++ b/test/Autofac.Pooling.Test/StrategyFactoryOverloadTests.cs @@ -0,0 +1,163 @@ +// Copyright (c) Autofac Project. All rights reserved. +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using Autofac.Pooling.Tests.Common; +using Xunit; + +namespace Autofac.Pooling.Test; + +public class StrategyFactoryOverloadTests +{ + [Fact] + public void StrategyFactory_RegistersAndResolves() + { + var builder = new ContainerBuilder(); + + builder.RegisterType() + .As() + .PooledPerLifetimeScope() + .ConfigureStrategy(ctx => new DefaultPooledRegistrationPolicy()); + + var container = builder.Build(); + + using (var scope1 = container.BeginLifetimeScope()) + { + scope1.Resolve(); + } + + using (var scope2 = container.BeginLifetimeScope()) + { + scope2.Resolve(); + } + + container.Dispose(); + } + + [Fact] + public void StrategyFactory_ResolveUsesDefaultObjectPool() + { + var builder = new ContainerBuilder(); + + var trackingPolicy = new PoolTrackingPolicy(); + builder.RegisterInstance(trackingPolicy).As>(); + + builder.RegisterType() + .As() + .PooledPerLifetimeScope() + .ConfigureStrategy(ctx => ctx.Resolve>()); + + var container = builder.Build(); + + using (var scope = container.BeginLifetimeScope()) + { + var instance = scope.Resolve(); + Assert.NotNull(instance); + Assert.IsType(instance); + } + + container.Dispose(); + } + + [Fact] + public void StrategyFactory_MultipleScopesReusesInstance() + { + var builder = new ContainerBuilder(); + + var trackingPolicy = new PoolTrackingPolicy(); + builder.RegisterInstance(trackingPolicy).As>(); + + IPooledService capturedInstance = null!; + + builder.RegisterType() + .As() + .PooledPerLifetimeScope() + .ConfigureStrategy(ctx => ctx.Resolve>()); + + var container = builder.Build(); + + using (var scope1 = container.BeginLifetimeScope()) + { + capturedInstance = scope1.Resolve(); + Assert.Equal(1, capturedInstance.GetCalled); + } + + Assert.Equal(1, capturedInstance.ReturnCalled); + + using (var scope2 = container.BeginLifetimeScope()) + { + var instance2 = scope2.Resolve(); + Assert.Same(capturedInstance, instance2); + Assert.Equal(2, instance2.GetCalled); + } + + Assert.Equal(2, capturedInstance.ReturnCalled); + + container.Dispose(); + } + + [Fact] + public void StrategyFactory_PolicyAcceptsAllReturns() + { + var builder = new ContainerBuilder(); + + var defaultPolicy = new DefaultPooledRegistrationPolicy(); + builder.RegisterInstance(defaultPolicy).As>(); + + builder.RegisterType() + .As() + .PooledPerLifetimeScope() + .ConfigureStrategy(ctx => ctx.Resolve>()); + + var container = builder.Build(); + + using (var scope = container.BeginLifetimeScope()) + { + scope.Resolve(); + } + + using (var scope2 = container.BeginLifetimeScope()) + { + scope2.Resolve(); + } + + container.Dispose(); + } + + [Fact] + public void StrategyFactory_PolicyFactoryReceivesComponentContext() + { + var builder = new ContainerBuilder(); + + var config = new PolicyConfig { MaxRetained = 16 }; + builder.RegisterInstance(config); + + var factoryCalled = false; + + builder.RegisterType() + .As() + .PooledPerLifetimeScope() + .ConfigureStrategy(ctx => + { + factoryCalled = true; + var cfg = ctx.Resolve(); + Assert.Equal(16, cfg.MaxRetained); + return new DefaultPooledRegistrationPolicy(cfg.MaxRetained); + }); + + var container = builder.Build(); + + using (var scope = container.BeginLifetimeScope()) + { + scope.Resolve(); + } + + Assert.True(factoryCalled); + + container.Dispose(); + } + + private class PolicyConfig + { + public int MaxRetained { get; set; } + } +} From 0bbc5f36f56e831e53ead29295ce2bbd0382bce2 Mon Sep 17 00:00:00 2001 From: "1622989459@qq.com" <1622989459@qq.com> Date: Sun, 14 Jun 2026 09:10:07 +0800 Subject: [PATCH 03/10] Remove junk files from commit --- .../1781355787144-8bb67aba-run_command.txt | 171 ---------------- .../1781356494407-a7427901-run_command.txt | 182 ------------------ .../1781364619590-92d833a4-run_command.txt | 146 -------------- .../1781365172382-60503cc2-run_command.txt | 146 -------------- .../1781366837259-1fb20d98-run_command.txt | 141 -------------- cache.sqlite.db | Bin 16384 -> 0 bytes cache.sqlite.db-shm | Bin 32768 -> 0 bytes cache.sqlite.db-wal | Bin 16512 -> 0 bytes 8 files changed, 786 deletions(-) delete mode 100644 .reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt delete mode 100644 .reasonix/truncated-results/1781356494407-a7427901-run_command.txt delete mode 100644 .reasonix/truncated-results/1781364619590-92d833a4-run_command.txt delete mode 100644 .reasonix/truncated-results/1781365172382-60503cc2-run_command.txt delete mode 100644 .reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt delete mode 100644 cache.sqlite.db delete mode 100644 cache.sqlite.db-shm delete mode 100644 cache.sqlite.db-wal diff --git a/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt b/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt deleted file mode 100644 index dfc69a5..0000000 --- a/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt +++ /dev/null @@ -1,171 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔══════════════════════════════════════╗ -║ 🎮 Autofac.KeyedResilience Demo ║ -║ HybridCache: FusionCache + SQLite ║ -╚══════════════════════════════════════╝ - -info: NeoSmart.Caching.Sqlite.SqliteCache[0] - Initializing db cache: Data Source=cache.sqlite.db;Mode=ReadWriteCreate;Cache=Shared -─── 演示 1: 从对象池取 Monster ─── -info: Program[0] - 池化怪物: 池化怪物 (Lv.1) - -─── 演示 2: Lazy> ─── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLJ K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLJ K=monsters:all): GetOrDefaultAsync return (default value) - 📂 执行 JSON 加载… -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLK K=monsters:all): SetAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] - -─── 演示 3: Polly 管道(内部 HybridCache → FusionCache → SQLite) ─── -info: Program[0] - Lazy 加载: 毒蘑菇 (Lv.2, 毒) -info: Program[0] - ──── 第 1 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] - -info: Program[0] - 🐉 结果: [mon-007] 毒蘑菇 Lv.2 毒 -info: Program[0] - ──── 第 2 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 🐉 结果: [mon-008] 岩石傀儡 Lv.8 地 - -info: Program[0] - ──── 第 3 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] - -info: Program[0] - 🐉 结果: [mon-002] 火焰精灵 Lv.3 火 -info: Program[0] - ──── 第 4 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 🐉 结果: [mon-002] 火焰精灵 Lv.3 火 - -info: Program[0] - ──── 第 5 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 🐉 结果: [mon-008] 岩石傀儡 Lv.8 地 - -─── 演示 4: 缓存验证 ─── -info: Program[0] - ──── 第 1 次调用 GetMonstersAsync ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 📦 拿到 10 个怪物 -info: Program[0] - ──── 第 2 次调用 GetMonstersAsync ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 📦 拿到 10 个怪物 -info: Program[0] - ──── 第 3 次调用 GetMonstersAsync ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 📦 拿到 10 个怪物 - -─── 演示 5: 池化对象复用 ─── -info: Program[0] - 取出: 池化怪物 -info: Program[0] - 已归还 -info: Program[0] - 再次取出: 池化怪物 - -info: Program[0] - 是否同一个对象: True -🏁 演示结束 diff --git a/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt b/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt deleted file mode 100644 index 1594764..0000000 --- a/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt +++ /dev/null @@ -1,182 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔══════════════════════════════════════╗ -║ 🎮 Autofac.KeyedResilience Demo ║ -║ HybridCache: FusionCache + SQLite ║ -╚══════════════════════════════════════╝ - -─── 演示 1: 怪物池化复用 ─── - -─── 演示 2: Lazy 延迟 Spawn ─── -info: Program[0] - 从池取出空壳 Monster,对象 ID: 17230008 -info: Program[0] - 怪物死亡,归还到池 -info: Program[0] - 新怪物出生,从池取出: 是否同一实例 = True -info: Program[0] - Lazy 还没生成… -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2ST K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2ST K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -─── 演示 3: 批量 Spawn 5 只怪物 ─── - 每个怪物从池取空壳 → 填充随机模板 → 出场 -info: Program[0] - ⚔️ 怪物出场: 雷狼龙 (Lv.4, 雷) -info: Program[0] - ──── 第 1 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -info: Program[0] - 🐉 [mon-010] 混沌魔王 Lv.12 混沌 ♥200 ⚔30 -info: Program[0] - 💀 怪物死亡,归还到池 -info: Program[0] - ──── 第 2 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -info: Program[0] - 🐉 [mon-006] 圣光骑士 Lv.7 光 ♥90 ⚔14 -info: Program[0] - 💀 怪物死亡,归还到池 -info: Program[0] - ──── 第 3 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-007] 毒蘑菇 Lv.2 毒 ♥25 ⚔7 - -info: Program[0] - 💀 怪物死亡,归还到池 -info: Program[0] - ──── 第 4 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-003] 冰霜巨人 Lv.5 冰 ♥80 ⚔8 - -info: Program[0] - 💀 怪物死亡,归还到池 -info: Program[0] - ──── 第 5 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-003] 冰霜巨人 Lv.5 冰 ♥80 ⚔8 - -info: Program[0] - 💀 怪物死亡,归还到池 -─── 演示 4: 怪物模板缓存验证 ─── -info: Program[0] - ──── 第 1 次读取怪物模板 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TD K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TE K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TE K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TF K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TF K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TD K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 📖 拿到了 10 种怪物模板 -info: Program[0] - ──── 第 2 次读取怪物模板 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TG K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TH K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TH K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TI K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TI K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TG K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 📖 拿到了 10 种怪物模板 -info: Program[0] - ──── 第 3 次读取怪物模板 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TJ K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TK K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TK K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TL K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TL K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TJ K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - 📂 JSON 只加载了一次,后续全部走 HybridCache → FusionCache → SQLite -info: Program[0] - 📖 拿到了 10 种怪物模板 - -🏁 演示结束 diff --git a/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt b/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt deleted file mode 100644 index 9a3cf49..0000000 --- a/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt +++ /dev/null @@ -1,146 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔═══════════════════════════════════╗ -║ Autofac.KeyedResilience Demo ║ -║ FusionCache + SQLite + Polly ║ -╚═══════════════════════════════════╝ - -info: Program[0] - === 1. Lazy 延迟生成 === -info: Program[0] - Lazy 创建了,还没执行… -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL6 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL7 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL7 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL8 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL8 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL6 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - ⚔️ 风暴巨龙 Lv.10 风 - -info: Program[0] - === 2. 批量生成(缓存模板数据) === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL9 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULA K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULA K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULB K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULB K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL9 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-007] 毒蘑菇 Lv.2 ♥25 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULC K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULD K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULD K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULE K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULE K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULC K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-010] 混沌魔王 Lv.12 ♥200 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULF K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULG K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULG K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULH K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULH K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULF K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULI K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULJ K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULJ K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULK K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULK K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULI K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-004] 雷狼龙 Lv.4 ♥50 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -info: Program[0] - 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 -info: Program[0] - === 3. 缓存验证 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 1 次 → 10 种模板 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 2 次 → 10 种模板 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUM0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUM0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -(JSON 只加载一次,后续全部走 HybridCache → FusionCache → SQLite) - -🏁 完成 -info: Program[0] - 第 3 次 → 10 种模板 diff --git a/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt b/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt deleted file mode 100644 index 025b011..0000000 --- a/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt +++ /dev/null @@ -1,146 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔═══════════════════════════════════╗ -║ Autofac.KeyedResilience Demo ║ -║ FusionCache + SQLite + Polly ║ -╚═══════════════════════════════════╝ - -info: Program[0] - === 1. Lazy 延迟生成 === -info: Program[0] - Lazy 已创建,尚未执行… -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNC K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKND K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKND K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNE K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNE K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNC K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - ⚔️ 岩石傀儡 Lv.8 地 - -info: Program[0] - === 2. 批量生成 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNF K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNG K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNG K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNH K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNH K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNF K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-010] 混沌魔王 Lv.12 ♥200 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNI K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNJ K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNJ K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNK K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNK K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNI K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-007] 毒蘑菇 Lv.2 ♥25 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-004] 雷狼龙 Lv.4 ♥50 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-002] 火焰精灵 Lv.3 ♥35 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -info: Program[0] - 🐉 [mon-005] 暗影刺客 Lv.6 ♥40 -info: Program[0] - === 3. 缓存验证 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 1 次 → 10 种模板 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 2 次 → 10 种模板 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -(JSON 只加载一次,后续 HybridCache → FusionCache → SQLite) -info: Program[0] - 第 3 次 → 10 种模板 - -🏁 完成 diff --git a/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt b/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt deleted file mode 100644 index 7a19895..0000000 --- a/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt +++ /dev/null @@ -1,141 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔═══════════════════════════════════╗ -║ Autofac.KeyedResilience Demo ║ -║ FusionCache + SQLite + Polly ║ -╚═══════════════════════════════════╝ - -info: Program[0] - === 1. Lazy 延迟生成 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - ⚔️ 岩石傀儡 Lv.8 -info: Program[0] - === 2. 批量生成 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-001] 史莱姆 Lv.1 ♥20 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PER K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PES K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PES K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PET K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PET K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PER K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-001] 史莱姆 Lv.1 ♥20 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-008] 岩石傀儡 Lv.8 ♥120 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-002] 火焰精灵 Lv.3 ♥35 -info: Program[0] - === 3. 缓存验证 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 1 次 → 模板已缓存 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 2 次 → 模板已缓存 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFD K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFE K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFE K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFF K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFF K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFD K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -🏁 完成 -info: Program[0] - 第 3 次 → 模板已缓存 diff --git a/cache.sqlite.db b/cache.sqlite.db deleted file mode 100644 index 5847ff116ae3495cb18ff1087ae1b2f12d607a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI%&q~8E90%~U6}1KJ5Tu6*hJdhvc<}|?v}m!mS}V?jNbDjG_eX0tHxGh7f^X$Z zco2L9@21@b6-4k_zJdH{(){^-$ffl7$ZaKpUiIP*Pv|Bo5mhByloCQznP+64CQUZ- z&&qV*k6I-gk9Q051#R(_nCFY1vO^ZaeyiIQ z!-z-M;zA5>Tk$As&uj;FEwriQ?br><^5cy9-lT`oilMXdG-gx>>YTN_tUUV(zif++ zNO+pH$x>mh?%I^4UE_H-V#M^&ZiLkHWj=A;b-CJrxBG(Wju+ayb|8BW1LvR?oY8&z ztisYcRijEzop8@T32ES;Iy=u)nX@cQd0EXi&JLRu>d&pSzTDme9!J+a{%!lZ>(|rM zOk&F&hsB~R9(enIM>NtqS4s;c2tWV=5P$##AOHafKmY;|fB*!FDv*BvtL6tWKg_S9 z#)!Be009U<00Izz00bZa0SG_<0>u|t(#o?@EO;WC^Y3r&%2V&t(8~Hi#P_XU7yti@ ae*+L91Rwwb2tWV=5P$##AOHafK;Rpo%Y2;x diff --git a/cache.sqlite.db-shm b/cache.sqlite.db-shm deleted file mode 100644 index 8f39ffd99a7f5a2cce20b73256cf89ad4ed35a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)p$!5t6b9gOKtLkTVj*~Pt1t~?kf5=*0E!V11cSlhSb#t)n$#kp-=8#To2D=C z8{oC~Rmd5HFdN0gIIi>baa!!UTl3mZ_M7>2*&m*lb$@KXe4qbL|GtZq_h}z%hbFFE zKivrd0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!Cu%3#6$NLZD88G;c)+5FkLHE`ecP?dq05A&{ob z2>}8G2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly IK;Sn7J}Rgv6951J diff --git a/cache.sqlite.db-wal b/cache.sqlite.db-wal deleted file mode 100644 index 71a986e74386ac47dcafcd2dad2bb02eb460d46d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16512 zcmeI2&u`mg7{{GtYiXr*AW;Qz!MqaEN;Bjid0*SPFxzohMAon_`$bz#ruDW^HyvqG zHl{IkoDkx|4TN?=;&0%}nG*;JBz6GQ1KJLpk&t*E$8p~{yKqE2R^r(2kLUTmpZ9$u zlND{(Ug}<=V?X{nAwy4%&n8ojBTw1|hynX{e6twE~r4 z(Wu{cbcfA#f-4<$r48?ktyTr1?T7I&Vsp)vPVh#s3MFr?HqW`MSJgLztEU+DS(;x` zFE=}9+ZQ|PYWs4texMd+%jI(6!AnWvL~L>@PNq)Eq}=;qfAeP8e_DF4)%H+LIyOlT z>qoul{V@J_5&?J-m)+Pe`1t4F&;0fEhu_UZSz+Nh1zvOz0U|&IhyW2F0z`la5CI}U z1c<=@iNL4zndL9uo>BIV+RkooZxHqOYGEATWtWoQ#kIA&thvQ%3@T4+n$9Y01%72i z!TOM!4P$+1o1PBWjxV6D741hctLYVX_76A}zrf~5&>eQ4>X24~-cK9*+jBO&HU zhzZ%pLUhQUDXC5>!EiYxX@;t1LItMsO-vG4Q^K&p5gXkDNe(oJVblYAeOL`V_edBB zLPEAg$d+{JP%k6m5H2SSiy#9xs)?}CEu5!`VFMHf%NqapPyXv4`vN~cet7NOhfku! z7dUySz>5wdKm>>Y5g-CYfCvx)B0vO)01+SpMBu+n;KkC+@`=}%KRJB<&u?;m4-5;v zf#YLe;M+f*`TkMu^H*`WiAm##h6Tol(EvlkX*kZ2l>r_KS{YojGSI%rJQgu&WniG3 zm668gCdUj0+9cqbRBeIhAeeGm(BR3O79kuE#v2y8P=@Kk*>lk(O1&sZkMgRLJoKe9 zd0-LAP78+1$+I;dT^xv=2y=u3#)}=e(@qOoV3{y(8DJH0z3Kol*Fkx9fc8=<%o+)E zBw;$R%!Hv)B`d>7Ib~@IgQG78u9@$F8zywkoetPL6dFzSeI&ol!B@>Zn;2hfri%|%#3ayiHlUo5L zB|7EJV91*RTgW;wB4m)gPYj7-ELhfQHTrx3tZXaUBD|^tAfbsyUagK}&eV!JZdu{m zxMe*Knl00o79cLLWVSUBHMU1hxX$J~Z$lnM%xNBNLMN!hin0t1Hm+^^xHjO{wLrPU z8<1ZZqK^C;qblL~*j^KL7|2G2b-Fvz9z4VaGc8O<7hrC3Ti7;Ej00<7_eOU!j01dX zEF5%qds2IcS2@h-MEg#71MKA9Fpewi96SZK6~dEX$^E_Yw;+DK(Ln@=01+SpM1Tko M0U|&Ih(Jo Date: Tue, 16 Jun 2026 03:48:01 +0800 Subject: [PATCH 04/10] Convert ObjectPool factory overload to IPooledRegistrationPolicy factory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the Func> overload (PooledInstancePerLifetimeScope) with Func>, wrapping the resolved policy in DefaultObjectPoolProvider + AutofacPooledObjectPolicy to align with the existing pooled registration paths. - PoolActivator: _poolFactory → _policyFactory; pipeline wraps policy in DefaultObjectPoolProvider + AutofacPooledObjectPolicy - PoolGetActivator: add _policyFactory constructor + resolve at pipeline - RegistrationExtensions: add PooledInstancePerLifetimeScope(policyFactory) and PooledInstancePerMatchingLifetimeScope(policyFactory, tags) - DelegatingPooledRegistrationPolicy: removed (no longer needed) - Tests: rewritten to cover policy factory path --- .../DelegatingPooledRegistrationPolicy.cs | 40 ---- src/Autofac.Pooling/PoolActivator.cs | 29 ++- src/Autofac.Pooling/PoolGetActivator.cs | 23 ++- src/Autofac.Pooling/RegistrationExtensions.cs | 97 +++++++-- .../FactoryOverloadTests.cs | 192 ++++++------------ 5 files changed, 180 insertions(+), 201 deletions(-) delete mode 100644 src/Autofac.Pooling/DelegatingPooledRegistrationPolicy.cs diff --git a/src/Autofac.Pooling/DelegatingPooledRegistrationPolicy.cs b/src/Autofac.Pooling/DelegatingPooledRegistrationPolicy.cs deleted file mode 100644 index b5adcc6..0000000 --- a/src/Autofac.Pooling/DelegatingPooledRegistrationPolicy.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) Autofac Project. All rights reserved. -// Licensed under the MIT License. See LICENSE in the project root for license information. - -using System; -using System.Collections.Generic; -using Autofac.Core; - -namespace Autofac.Pooling; - -/// -/// A simple that delegates -/// to the -/// getFromPool callback, allowing the underlying -/// custom ObjectPool<T> to manage its own creation and -/// return behavior. Used when a custom pool is provided via a factory. -/// -/// The type of object being pooled. -internal sealed class DelegatingPooledRegistrationPolicy : IPooledRegistrationPolicy - where TPooledObject : class -{ - /// - public int MaximumRetained => int.MaxValue; - - /// - public TPooledObject Get(IComponentContext context, IEnumerable parameters, Func getFromPool) - { - if (getFromPool is null) - { - throw new ArgumentNullException(nameof(getFromPool)); - } - - return getFromPool(); - } - - /// - public bool Return(TPooledObject pooledObject) - { - return true; - } -} diff --git a/src/Autofac.Pooling/PoolActivator.cs b/src/Autofac.Pooling/PoolActivator.cs index 68171c2..0e52492 100644 --- a/src/Autofac.Pooling/PoolActivator.cs +++ b/src/Autofac.Pooling/PoolActivator.cs @@ -18,7 +18,7 @@ internal sealed class PoolActivator : IInstanceActivator private readonly Service? _pooledInstanceService; private readonly IPooledRegistrationPolicy? _policy; private readonly DefaultObjectPoolProvider? _poolProvider; - private readonly Func>? _poolFactory; + private readonly Func>? _policyFactory; /// /// Initializes a new instance of the class @@ -38,16 +38,19 @@ public PoolActivator(Service pooledInstanceService, IPooledRegistrationPolicy /// Initializes a new instance of the class - /// using a factory function to create the at resolve time. + /// using a factory function to create the at resolve time. + /// The default will create the backing pool. /// - /// - /// A factory that returns the to use. + /// The service used to resolve new instances of the pooled registration. + /// + /// A factory that returns the to use. /// Invoked during resolve, so the is available /// for resolving dependencies. /// - public PoolActivator(Func> poolFactory) + public PoolActivator(Service pooledInstanceService, Func> policyFactory) { - _poolFactory = poolFactory ?? throw new ArgumentNullException(nameof(poolFactory)); + _pooledInstanceService = pooledInstanceService; + _policyFactory = policyFactory ?? throw new ArgumentNullException(nameof(policyFactory)); } /// @@ -58,10 +61,18 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic { pipelineBuilder.Use(PipelinePhase.Activation, (context, next) => { - if (_poolFactory is not null) + if (_policyFactory is not null) { - // Custom factory: let the caller create the pool at resolve time. - context.Instance = _poolFactory(context); + // Custom policy factory: resolve the strategy at resolve time, then create DefaultObjectPool. + var policy = _policyFactory(context); + var poolProvider = new DefaultObjectPoolProvider + { + MaximumRetained = policy.MaximumRetained, + }; + var scope = context.Resolve(); + var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService!, scope, policy); + var pool = poolProvider.Create(poolPolicy); + context.Instance = pool; } else { diff --git a/src/Autofac.Pooling/PoolGetActivator.cs b/src/Autofac.Pooling/PoolGetActivator.cs index 4bfad02..91b6490 100644 --- a/src/Autofac.Pooling/PoolGetActivator.cs +++ b/src/Autofac.Pooling/PoolGetActivator.cs @@ -17,7 +17,8 @@ internal sealed class PoolGetActivator : IInstanceActivator where TLimit : class { private readonly PoolService _poolService; - private readonly IPooledRegistrationPolicy _registrationPolicy; + private readonly IPooledRegistrationPolicy? _registrationPolicy; + private readonly Func>? _policyFactory; /// /// Initializes a new instance of the class. @@ -30,6 +31,21 @@ public PoolGetActivator(PoolService poolService, IPooledRegistrationPolicy + /// Initializes a new instance of the class + /// with a factory that resolves the policy at resolve time. + /// + /// The service used to access the pool. + /// + /// A factory that returns the to use. + /// Invoked during resolve with access to the current . + /// + public PoolGetActivator(PoolService poolService, Func> policyFactory) + { + _poolService = poolService; + _policyFactory = policyFactory ?? throw new ArgumentNullException(nameof(policyFactory)); + } + /// public Type LimitType { get; } = typeof(TLimit); @@ -39,6 +55,7 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic pipelineBuilder.Use(PipelinePhase.Activation, (ctxt, next) => { var pool = (ObjectPool)ctxt.ResolveService(_poolService); + var policy = _policyFactory?.Invoke(ctxt) ?? _registrationPolicy!; var didGetFromPool = false; TLimit PoolGet() @@ -47,11 +64,11 @@ TLimit PoolGet() return pool.Get(); } - var poolItem = _registrationPolicy.Get(ctxt, ctxt.Parameters, PoolGet) ?? throw new InvalidOperationException( + var poolItem = policy.Get(ctxt, ctxt.Parameters, PoolGet) ?? throw new InvalidOperationException( string.Format( CultureInfo.CurrentCulture, PoolGetActivatorResources.PolicyMustReturnInstance, - _registrationPolicy.GetType().FullName, + policy.GetType().FullName, typeof(TLimit).FullName)); if (didGetFromPool) diff --git a/src/Autofac.Pooling/RegistrationExtensions.cs b/src/Autofac.Pooling/RegistrationExtensions.cs index 913e7f0..0d880e9 100644 --- a/src/Autofac.Pooling/RegistrationExtensions.cs +++ b/src/Autofac.Pooling/RegistrationExtensions.cs @@ -11,7 +11,6 @@ using Autofac.Core.Registration; using Autofac.Core.Resolving.Middleware; using Autofac.Core.Resolving.Pipeline; -using Microsoft.Extensions.ObjectPool; namespace Autofac.Pooling; @@ -146,30 +145,32 @@ public static IRegistrationBuilder /// /// - /// This method accepts a factory function that returns the to use. The factory is invoked - /// during resolve, so you may resolve dependencies from the (e.g. sp => sp.Resolve<ObjectPool<T>>()). - /// This allows the pool itself to be registered as a component and have its dependencies managed by the container. + /// This method accepts a factory function that returns the to use. + /// The factory is invoked during resolve, so you may resolve dependencies from the + /// (e.g. ctx => ctx.Resolve<IMyPolicy>()). + /// This allows the policy itself to be registered as a component and have its dependencies managed by the container. /// /// /// - /// If the created by the factory implements , it will be disposed - /// when the container is disposed. Components implementing will still receive - /// and lifecycle notifications. + /// The size of the pool created with this method is equal to the + /// value returned by the factory. + /// If more instances are requested than the pool size, those instances may not be returned to the pool, + /// but will instead be disposed/discarded. /// /// /// Registration limit type. /// Activator data type. /// Registration style. /// The registration. - /// - /// A factory that returns the to use for this registration. + /// + /// A factory that returns the to use for this registration. /// Invoked during resolve with access to the current . /// /// The registration builder. public static IRegistrationBuilder PooledInstancePerLifetimeScope( this IRegistrationBuilder registration, - Func> poolFactory) + Func> policyFactory) where TSingleRegistrationStyle : SingleRegistrationStyle where TActivatorData : IConcreteActivatorData where TLimit : class @@ -179,12 +180,12 @@ public static IRegistrationBuilder + /// Configure the component so that every dependent component or manual resolve within + /// a tagged with any of the provided tags value gets the same, shared instance, + /// retrieved from a single pool of instances shared by all lifetime scopes. + /// When the scope ends, the instance will be returned to the pool. + /// Dependent components in lifetime scopes that are children of the tagged scope will + /// share the parent's instance. If no appropriately tagged scope can be found in the + /// hierarchy an is thrown. + /// + /// + /// + /// This method accepts a factory function that returns the to use. + /// The factory is invoked during resolve, so you may resolve dependencies from the + /// (e.g. ctx => ctx.Resolve<IMyPolicy>()). + /// This allows the policy itself to be registered as a component and have its dependencies managed by the container. + /// + /// + /// + /// The size of the pool created with this method is equal to the + /// value returned by the factory. + /// If more instances are requested than the pool size, those instances may not be returned to the pool, + /// but will instead be disposed/discarded. + /// + /// + /// Registration limit type. + /// Activator data type. + /// Registration style. + /// The registration. + /// + /// A factory that returns the to use for this registration. + /// Invoked during resolve with access to the current . + /// + /// Tags applied to matching lifetime scopes. + /// The registration builder. + public static IRegistrationBuilder + PooledInstancePerMatchingLifetimeScope( + this IRegistrationBuilder registration, + Func> policyFactory, + params object[] lifetimeScopeTags) + where TSingleRegistrationStyle : SingleRegistrationStyle + where TActivatorData : IConcreteActivatorData + where TLimit : class + { + if (registration == null) + { + throw new ArgumentNullException(nameof(registration)); + } + + if (policyFactory == null) + { + throw new ArgumentNullException(nameof(policyFactory)); + } + + RegisterPooled(registration, policyFactory, lifetimeScopeTags); + + return registration; + } + private static void RegisterPooled( IRegistrationBuilder registration, IPooledRegistrationPolicy registrationPolicy, @@ -430,9 +489,11 @@ private static void RegisterPooled( IRegistrationBuilder registration, - Func> poolFactory, + Func> policyFactory, object[]? tags) where TSingleRegistrationStyle : SingleRegistrationStyle where TActivatorData : IConcreteActivatorData @@ -443,9 +504,9 @@ private static void RegisterPooled(poolFactory), + new PoolActivator(pooledInstanceService, policyFactory), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, @@ -520,7 +581,7 @@ private static void RegisterPooled(poolService, new DelegatingPooledRegistrationPolicy()), + new PoolGetActivator(poolService, policyFactory), pooledGetLifetime, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, diff --git a/test/Autofac.Pooling.Test/FactoryOverloadTests.cs b/test/Autofac.Pooling.Test/FactoryOverloadTests.cs index cbb016b..2ef3111 100644 --- a/test/Autofac.Pooling.Test/FactoryOverloadTests.cs +++ b/test/Autofac.Pooling.Test/FactoryOverloadTests.cs @@ -1,71 +1,21 @@ // Copyright (c) Autofac Project. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. -using System.Collections.Generic; using Autofac.Pooling.Tests.Common; -using Microsoft.Extensions.ObjectPool; using Xunit; namespace Autofac.Pooling.Test; public class FactoryOverloadTests { - /// - /// A simple tracking pool that records how many instances it has created. - /// - private class TrackingObjectPool : ObjectPool - where T : class, new() - { - private readonly List _items = new(); - private readonly object _lock = new(); - - public int CreateCount { get; private set; } - - public override T Get() - { - lock (_lock) - { - if (_items.Count > 0) - { - var item = _items[^1]; - _items.RemoveAt(_items.Count - 1); - return item; - } - } - - CreateCount++; - return new T(); - } - - public override void Return(T obj) - { - lock (_lock) - { - _items.Add(obj); - } - } - - public void Clear() - { - lock (_lock) - { - _items.Clear(); - } - } - } - [Fact] - public void FactoryOverload_RegistersAndResolves() + public void PolicyFactory_RegistersAndResolves() { var builder = new ContainerBuilder(); - // Register the pool as a component. - var trackingPool = new TrackingObjectPool(); - builder.RegisterInstance(trackingPool).As>(); - builder.RegisterType() .As() - .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + .PooledInstancePerLifetimeScope(ctx => new DefaultPooledRegistrationPolicy()); var container = builder.Build(); @@ -74,35 +24,31 @@ public void FactoryOverload_RegistersAndResolves() scope1.Resolve(); } - // Second scope reuses the instance from the pool. using (var scope2 = container.BeginLifetimeScope()) { scope2.Resolve(); } - // Our custom pool was used, not the default one. - Assert.Equal(1, trackingPool.CreateCount); - container.Dispose(); } [Fact] - public void FactoryOverload_ResolveUsesProvidedPool() + public void PolicyFactory_ResolveUsesDefaultObjectPool() { var builder = new ContainerBuilder(); - var trackingPool = new TrackingObjectPool(); - builder.RegisterInstance(trackingPool).As>(); + var trackingPolicy = new PoolTrackingPolicy(); + builder.RegisterInstance(trackingPolicy).As>(); builder.RegisterType() .As() - .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + .PooledInstancePerLifetimeScope(ctx => ctx.Resolve>()); var container = builder.Build(); - using (var scope1 = container.BeginLifetimeScope()) + using (var scope = container.BeginLifetimeScope()) { - var instance = scope1.Resolve(); + var instance = scope.Resolve(); Assert.NotNull(instance); Assert.IsType(instance); } @@ -111,143 +57,127 @@ public void FactoryOverload_ResolveUsesProvidedPool() } [Fact] - public void FactoryOverload_WithIPooledComponent_OnReturnToPoolFires() + public void PolicyFactory_MultipleScopesReusesInstance() { var builder = new ContainerBuilder(); - var trackingPool = new TrackingObjectPool(); - builder.RegisterInstance(trackingPool).As>(); + var trackingPolicy = new PoolTrackingPolicy(); + builder.RegisterInstance(trackingPolicy).As>(); + + IPooledService capturedInstance = null!; builder.RegisterType() .As() - .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + .PooledInstancePerLifetimeScope(ctx => ctx.Resolve>()); var container = builder.Build(); - IPooledService instance; - using (var scope1 = container.BeginLifetimeScope()) { - instance = scope1.Resolve(); - Assert.Equal(1, instance.GetCalled); + capturedInstance = scope1.Resolve(); + Assert.Equal(1, capturedInstance.GetCalled); + } + + Assert.Equal(1, capturedInstance.ReturnCalled); + + using (var scope2 = container.BeginLifetimeScope()) + { + var instance2 = scope2.Resolve(); + Assert.Same(capturedInstance, instance2); + Assert.Equal(2, instance2.GetCalled); } - // OnReturnToPool should have been called when the scope ended. - Assert.Equal(1, instance.ReturnCalled); + Assert.Equal(2, capturedInstance.ReturnCalled); container.Dispose(); } [Fact] - public void FactoryOverload_WithIPooledComponent_OnGetFromPoolFires() + public void PolicyFactory_PolicyAcceptsAllReturns() { var builder = new ContainerBuilder(); - var trackingPool = new TrackingObjectPool(); - builder.RegisterInstance(trackingPool).As>(); + var defaultPolicy = new DefaultPooledRegistrationPolicy(); + builder.RegisterInstance(defaultPolicy).As>(); builder.RegisterType() .As() - .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + .PooledInstancePerLifetimeScope(ctx => ctx.Resolve>()); var container = builder.Build(); - using (var scope1 = container.BeginLifetimeScope()) + using (var scope = container.BeginLifetimeScope()) { - var instance = scope1.Resolve(); - Assert.Equal(1, instance.GetCalled); - - // Resolve again in the same scope - should get the same shared instance. - var instance2 = scope1.Resolve(); - Assert.Same(instance, instance2); + scope.Resolve(); + } - // OnGetFromPool should only be called once per scope. - Assert.Equal(1, instance.GetCalled); + using (var scope2 = container.BeginLifetimeScope()) + { + scope2.Resolve(); } container.Dispose(); } [Fact] - public void FactoryOverload_MultipleScopesReusesInstance() + public void PolicyFactory_PolicyFactoryReceivesComponentContext() { var builder = new ContainerBuilder(); - var trackingPool = new TrackingObjectPool(); - builder.RegisterInstance(trackingPool).As>(); + var config = new PolicyConfig { MaxRetained = 16 }; + builder.RegisterInstance(config); - IPooledService capturedInstance = null!; + var factoryCalled = false; builder.RegisterType() .As() - .PooledInstancePerLifetimeScope(sp => sp.Resolve>()); + .PooledInstancePerLifetimeScope(ctx => + { + factoryCalled = true; + var cfg = ctx.Resolve(); + Assert.Equal(16, cfg.MaxRetained); + return new DefaultPooledRegistrationPolicy(cfg.MaxRetained); + }); var container = builder.Build(); - // First scope - resolves a new instance. - using (var scope1 = container.BeginLifetimeScope()) - { - capturedInstance = scope1.Resolve(); - Assert.Equal(1, capturedInstance.GetCalled); - } - - // Instance returned to pool; OnReturnToPool should have fired. - Assert.Equal(1, capturedInstance.ReturnCalled); - - // Second scope - should get same instance from pool. - using (var scope2 = container.BeginLifetimeScope()) + using (var scope = container.BeginLifetimeScope()) { - var instance2 = scope2.Resolve(); - Assert.Same(capturedInstance, instance2); - - // OnGetFromPool should fire again on second scope. - Assert.Equal(2, instance2.GetCalled); + scope.Resolve(); } - // OnReturnToPool should fire again on second scope. - Assert.Equal(2, capturedInstance.ReturnCalled); - - // Still only 1 instance created by the pool. - Assert.Equal(1, trackingPool.CreateCount); + Assert.True(factoryCalled); container.Dispose(); } [Fact] - public void FactoryOverload_PoolFactoryReceivesComponentContext() + public void PolicyFactory_WithMatchingScopeTag() { var builder = new ContainerBuilder(); - // Register a dependency that the pool factory can resolve. - var poolSize = new PoolConfig { Size = 42 }; - builder.RegisterInstance(poolSize); - - var factoryCalled = false; + var trackingPolicy = new PoolTrackingPolicy(); + builder.RegisterInstance(trackingPolicy).As>(); builder.RegisterType() .As() - .PooledInstancePerLifetimeScope(sp => - { - factoryCalled = true; - var config = sp.Resolve(); - Assert.Equal(42, config.Size); - return new DefaultObjectPool(new DefaultPooledObjectPolicy(), config.Size); - }); + .PooledInstancePerMatchingLifetimeScope( + ctx => ctx.Resolve>(), + "tag"); var container = builder.Build(); - using (var scope = container.BeginLifetimeScope()) + using (var scope = container.BeginLifetimeScope("tag")) { - scope.Resolve(); + var instance = scope.Resolve(); + Assert.NotNull(instance); } - Assert.True(factoryCalled); - container.Dispose(); } - private class PoolConfig + private class PolicyConfig { - public int Size { get; set; } + public int MaxRetained { get; set; } } } From fecf8408dff4d5dc1824c9cd67dea6c38135d4c9 Mon Sep 17 00:00:00 2001 From: "1622989459@qq.com" <1622989459@qq.com> Date: Tue, 16 Jun 2026 03:51:24 +0800 Subject: [PATCH 05/10] Revert "Remove junk files from commit" This reverts commit 0bbc5f36f56e831e53ead29295ce2bbd0382bce2. --- .../1781355787144-8bb67aba-run_command.txt | 171 ++++++++++++++++ .../1781356494407-a7427901-run_command.txt | 182 ++++++++++++++++++ .../1781364619590-92d833a4-run_command.txt | 146 ++++++++++++++ .../1781365172382-60503cc2-run_command.txt | 146 ++++++++++++++ .../1781366837259-1fb20d98-run_command.txt | 141 ++++++++++++++ cache.sqlite.db | Bin 0 -> 16384 bytes cache.sqlite.db-shm | Bin 0 -> 32768 bytes cache.sqlite.db-wal | Bin 0 -> 16512 bytes 8 files changed, 786 insertions(+) create mode 100644 .reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt create mode 100644 .reasonix/truncated-results/1781356494407-a7427901-run_command.txt create mode 100644 .reasonix/truncated-results/1781364619590-92d833a4-run_command.txt create mode 100644 .reasonix/truncated-results/1781365172382-60503cc2-run_command.txt create mode 100644 .reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt create mode 100644 cache.sqlite.db create mode 100644 cache.sqlite.db-shm create mode 100644 cache.sqlite.db-wal diff --git a/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt b/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt new file mode 100644 index 0000000..dfc69a5 --- /dev/null +++ b/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt @@ -0,0 +1,171 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔══════════════════════════════════════╗ +║ 🎮 Autofac.KeyedResilience Demo ║ +║ HybridCache: FusionCache + SQLite ║ +╚══════════════════════════════════════╝ + +info: NeoSmart.Caching.Sqlite.SqliteCache[0] + Initializing db cache: Data Source=cache.sqlite.db;Mode=ReadWriteCreate;Cache=Shared +─── 演示 1: 从对象池取 Monster ─── +info: Program[0] + 池化怪物: 池化怪物 (Lv.1) + +─── 演示 2: Lazy> ─── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLJ K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLJ K=monsters:all): GetOrDefaultAsync return (default value) + 📂 执行 JSON 加载… +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLK K=monsters:all): SetAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] + +─── 演示 3: Polly 管道(内部 HybridCache → FusionCache → SQLite) ─── +info: Program[0] + Lazy 加载: 毒蘑菇 (Lv.2, 毒) +info: Program[0] + ──── 第 1 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] + +info: Program[0] + 🐉 结果: [mon-007] 毒蘑菇 Lv.2 毒 +info: Program[0] + ──── 第 2 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 🐉 结果: [mon-008] 岩石傀儡 Lv.8 地 + +info: Program[0] + ──── 第 3 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] + +info: Program[0] + 🐉 结果: [mon-002] 火焰精灵 Lv.3 火 +info: Program[0] + ──── 第 4 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 🐉 结果: [mon-002] 火焰精灵 Lv.3 火 + +info: Program[0] + ──── 第 5 次调用 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 🐉 结果: [mon-008] 岩石傀儡 Lv.8 地 + +─── 演示 4: 缓存验证 ─── +info: Program[0] + ──── 第 1 次调用 GetMonstersAsync ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 📦 拿到 10 个怪物 +info: Program[0] + ──── 第 2 次调用 GetMonstersAsync ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 📦 拿到 10 个怪物 +info: Program[0] + ──── 第 3 次调用 GetMonstersAsync ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] +info: Program[0] + 📦 拿到 10 个怪物 + +─── 演示 5: 池化对象复用 ─── +info: Program[0] + 取出: 池化怪物 +info: Program[0] + 已归还 +info: Program[0] + 再次取出: 池化怪物 + +info: Program[0] + 是否同一个对象: True +🏁 演示结束 diff --git a/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt b/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt new file mode 100644 index 0000000..1594764 --- /dev/null +++ b/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt @@ -0,0 +1,182 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔══════════════════════════════════════╗ +║ 🎮 Autofac.KeyedResilience Demo ║ +║ HybridCache: FusionCache + SQLite ║ +╚══════════════════════════════════════╝ + +─── 演示 1: 怪物池化复用 ─── + +─── 演示 2: Lazy 延迟 Spawn ─── +info: Program[0] + 从池取出空壳 Monster,对象 ID: 17230008 +info: Program[0] + 怪物死亡,归还到池 +info: Program[0] + 新怪物出生,从池取出: 是否同一实例 = True +info: Program[0] + Lazy 还没生成… +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2ST K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2ST K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +─── 演示 3: 批量 Spawn 5 只怪物 ─── + 每个怪物从池取空壳 → 填充随机模板 → 出场 +info: Program[0] + ⚔️ 怪物出场: 雷狼龙 (Lv.4, 雷) +info: Program[0] + ──── 第 1 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +info: Program[0] + 🐉 [mon-010] 混沌魔王 Lv.12 混沌 ♥200 ⚔30 +info: Program[0] + 💀 怪物死亡,归还到池 +info: Program[0] + ──── 第 2 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +info: Program[0] + 🐉 [mon-006] 圣光骑士 Lv.7 光 ♥90 ⚔14 +info: Program[0] + 💀 怪物死亡,归还到池 +info: Program[0] + ──── 第 3 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-007] 毒蘑菇 Lv.2 毒 ♥25 ⚔7 + +info: Program[0] + 💀 怪物死亡,归还到池 +info: Program[0] + ──── 第 4 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-003] 冰霜巨人 Lv.5 冰 ♥80 ⚔8 + +info: Program[0] + 💀 怪物死亡,归还到池 +info: Program[0] + ──── 第 5 只怪物出生 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-003] 冰霜巨人 Lv.5 冰 ♥80 ⚔8 + +info: Program[0] + 💀 怪物死亡,归还到池 +─── 演示 4: 怪物模板缓存验证 ─── +info: Program[0] + ──── 第 1 次读取怪物模板 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TD K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TE K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TE K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TF K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TF K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TD K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 📖 拿到了 10 种怪物模板 +info: Program[0] + ──── 第 2 次读取怪物模板 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TG K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TH K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TH K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TI K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TI K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TG K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 📖 拿到了 10 种怪物模板 +info: Program[0] + ──── 第 3 次读取怪物模板 ──── +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TJ K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TK K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TK K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TL K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TL K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TJ K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + 📂 JSON 只加载了一次,后续全部走 HybridCache → FusionCache → SQLite +info: Program[0] + 📖 拿到了 10 种怪物模板 + +🏁 演示结束 diff --git a/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt b/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt new file mode 100644 index 0000000..9a3cf49 --- /dev/null +++ b/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt @@ -0,0 +1,146 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔═══════════════════════════════════╗ +║ Autofac.KeyedResilience Demo ║ +║ FusionCache + SQLite + Polly ║ +╚═══════════════════════════════════╝ + +info: Program[0] + === 1. Lazy 延迟生成 === +info: Program[0] + Lazy 创建了,还没执行… +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL6 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL7 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL7 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL8 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL8 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL6 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + ⚔️ 风暴巨龙 Lv.10 风 + +info: Program[0] + === 2. 批量生成(缓存模板数据) === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL9 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULA K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULA K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULB K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULB K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL9 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-007] 毒蘑菇 Lv.2 ♥25 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULC K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULD K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULD K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULE K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULE K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULC K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-010] 混沌魔王 Lv.12 ♥200 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULF K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULG K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULG K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULH K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULH K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULF K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULI K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULJ K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULJ K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULK K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULK K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULI K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-004] 雷狼龙 Lv.4 ♥50 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +info: Program[0] + 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 +info: Program[0] + === 3. 缓存验证 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 1 次 → 10 种模板 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 2 次 → 10 种模板 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUM0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUM0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +(JSON 只加载一次,后续全部走 HybridCache → FusionCache → SQLite) + +🏁 完成 +info: Program[0] + 第 3 次 → 10 种模板 diff --git a/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt b/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt new file mode 100644 index 0000000..025b011 --- /dev/null +++ b/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt @@ -0,0 +1,146 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔═══════════════════════════════════╗ +║ Autofac.KeyedResilience Demo ║ +║ FusionCache + SQLite + Polly ║ +╚═══════════════════════════════════╝ + +info: Program[0] + === 1. Lazy 延迟生成 === +info: Program[0] + Lazy 已创建,尚未执行… +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNC K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKND K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKND K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNE K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNE K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNC K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + ⚔️ 岩石傀儡 Lv.8 地 + +info: Program[0] + === 2. 批量生成 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNF K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNG K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNG K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNH K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNH K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNF K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-010] 混沌魔王 Lv.12 ♥200 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNI K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNJ K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNJ K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNK K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNK K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNI K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-007] 毒蘑菇 Lv.2 ♥25 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-004] 雷狼龙 Lv.4 ♥50 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-002] 火焰精灵 Lv.3 ♥35 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +info: Program[0] + 🐉 [mon-005] 暗影刺客 Lv.6 ♥40 +info: Program[0] + === 3. 缓存验证 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 1 次 → 10 种模板 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 2 次 → 10 种模板 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +(JSON 只加载一次,后续 HybridCache → FusionCache → SQLite) +info: Program[0] + 第 3 次 → 10 种模板 + +🏁 完成 diff --git a/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt b/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt new file mode 100644 index 0000000..7a19895 --- /dev/null +++ b/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt @@ -0,0 +1,141 @@ +$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 +[exit 0] +╔═══════════════════════════════════╗ +║ Autofac.KeyedResilience Demo ║ +║ FusionCache + SQLite + Polly ║ +╚═══════════════════════════════════╝ + +info: Program[0] + === 1. Lazy 延迟生成 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + ⚔️ 岩石傀儡 Lv.8 +info: Program[0] + === 2. 批量生成 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-001] 史莱姆 Lv.1 ♥20 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PER K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PES K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PES K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PET K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PET K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PER K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-001] 史莱姆 Lv.1 ♥20 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-008] 岩石傀儡 Lv.8 ♥120 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 🐉 [mon-002] 火焰精灵 Lv.3 ♥35 +info: Program[0] + === 3. 缓存验证 === +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 1 次 → 模板已缓存 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] +info: Program[0] + 第 2 次 → 模板已缓存 +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFD K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFE K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFE K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFF K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFF K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] +info: ZiggyCreatures.Caching.Fusion.FusionCache[0] + FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFD K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] + +🏁 完成 +info: Program[0] + 第 3 次 → 模板已缓存 diff --git a/cache.sqlite.db b/cache.sqlite.db new file mode 100644 index 0000000000000000000000000000000000000000..5847ff116ae3495cb18ff1087ae1b2f12d607a51 GIT binary patch literal 16384 zcmeI%&q~8E90%~U6}1KJ5Tu6*hJdhvc<}|?v}m!mS}V?jNbDjG_eX0tHxGh7f^X$Z zco2L9@21@b6-4k_zJdH{(){^-$ffl7$ZaKpUiIP*Pv|Bo5mhByloCQznP+64CQUZ- z&&qV*k6I-gk9Q051#R(_nCFY1vO^ZaeyiIQ z!-z-M;zA5>Tk$As&uj;FEwriQ?br><^5cy9-lT`oilMXdG-gx>>YTN_tUUV(zif++ zNO+pH$x>mh?%I^4UE_H-V#M^&ZiLkHWj=A;b-CJrxBG(Wju+ayb|8BW1LvR?oY8&z ztisYcRijEzop8@T32ES;Iy=u)nX@cQd0EXi&JLRu>d&pSzTDme9!J+a{%!lZ>(|rM zOk&F&hsB~R9(enIM>NtqS4s;c2tWV=5P$##AOHafKmY;|fB*!FDv*BvtL6tWKg_S9 z#)!Be009U<00Izz00bZa0SG_<0>u|t(#o?@EO;WC^Y3r&%2V&t(8~Hi#P_XU7yti@ ae*+L91Rwwb2tWV=5P$##AOHafK;Rpo%Y2;x literal 0 HcmV?d00001 diff --git a/cache.sqlite.db-shm b/cache.sqlite.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..8f39ffd99a7f5a2cce20b73256cf89ad4ed35a60 GIT binary patch literal 32768 zcmeI)p$!5t6b9gOKtLkTVj*~Pt1t~?kf5=*0E!V11cSlhSb#t)n$#kp-=8#To2D=C z8{oC~Rmd5HFdN0gIIi>baa!!UTl3mZ_M7>2*&m*lb$@KXe4qbL|GtZq_h}z%hbFFE zKivrd0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!Cu%3#6$NLZD88G;c)+5FkLHE`ecP?dq05A&{ob z2>}8G2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly IK;Sn7J}Rgv6951J literal 0 HcmV?d00001 diff --git a/cache.sqlite.db-wal b/cache.sqlite.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..71a986e74386ac47dcafcd2dad2bb02eb460d46d GIT binary patch literal 16512 zcmeI2&u`mg7{{GtYiXr*AW;Qz!MqaEN;Bjid0*SPFxzohMAon_`$bz#ruDW^HyvqG zHl{IkoDkx|4TN?=;&0%}nG*;JBz6GQ1KJLpk&t*E$8p~{yKqE2R^r(2kLUTmpZ9$u zlND{(Ug}<=V?X{nAwy4%&n8ojBTw1|hynX{e6twE~r4 z(Wu{cbcfA#f-4<$r48?ktyTr1?T7I&Vsp)vPVh#s3MFr?HqW`MSJgLztEU+DS(;x` zFE=}9+ZQ|PYWs4texMd+%jI(6!AnWvL~L>@PNq)Eq}=;qfAeP8e_DF4)%H+LIyOlT z>qoul{V@J_5&?J-m)+Pe`1t4F&;0fEhu_UZSz+Nh1zvOz0U|&IhyW2F0z`la5CI}U z1c<=@iNL4zndL9uo>BIV+RkooZxHqOYGEATWtWoQ#kIA&thvQ%3@T4+n$9Y01%72i z!TOM!4P$+1o1PBWjxV6D741hctLYVX_76A}zrf~5&>eQ4>X24~-cK9*+jBO&HU zhzZ%pLUhQUDXC5>!EiYxX@;t1LItMsO-vG4Q^K&p5gXkDNe(oJVblYAeOL`V_edBB zLPEAg$d+{JP%k6m5H2SSiy#9xs)?}CEu5!`VFMHf%NqapPyXv4`vN~cet7NOhfku! z7dUySz>5wdKm>>Y5g-CYfCvx)B0vO)01+SpMBu+n;KkC+@`=}%KRJB<&u?;m4-5;v zf#YLe;M+f*`TkMu^H*`WiAm##h6Tol(EvlkX*kZ2l>r_KS{YojGSI%rJQgu&WniG3 zm668gCdUj0+9cqbRBeIhAeeGm(BR3O79kuE#v2y8P=@Kk*>lk(O1&sZkMgRLJoKe9 zd0-LAP78+1$+I;dT^xv=2y=u3#)}=e(@qOoV3{y(8DJH0z3Kol*Fkx9fc8=<%o+)E zBw;$R%!Hv)B`d>7Ib~@IgQG78u9@$F8zywkoetPL6dFzSeI&ol!B@>Zn;2hfri%|%#3ayiHlUo5L zB|7EJV91*RTgW;wB4m)gPYj7-ELhfQHTrx3tZXaUBD|^tAfbsyUagK}&eV!JZdu{m zxMe*Knl00o79cLLWVSUBHMU1hxX$J~Z$lnM%xNBNLMN!hin0t1Hm+^^xHjO{wLrPU z8<1ZZqK^C;qblL~*j^KL7|2G2b-Fvz9z4VaGc8O<7hrC3Ti7;Ej00<7_eOU!j01dX zEF5%qds2IcS2@h-MEg#71MKA9Fpewi96SZK6~dEX$^E_Yw;+DK(Ln@=01+SpM1Tko M0U|&Ih(Jo Date: Tue, 16 Jun 2026 03:51:27 +0800 Subject: [PATCH 06/10] Revert "Add metadata-based pool/strategy configuration with type-safe builder" This reverts commit 596999ebe64b3ab9d3cdae02723f4b4e05201169. --- .../1781355787144-8bb67aba-run_command.txt | 171 ----------- .../1781356494407-a7427901-run_command.txt | 182 ----------- .../1781364619590-92d833a4-run_command.txt | 146 --------- .../1781365172382-60503cc2-run_command.txt | 146 --------- .../1781366837259-1fb20d98-run_command.txt | 141 --------- cache.sqlite.db | Bin 16384 -> 0 bytes cache.sqlite.db-shm | Bin 32768 -> 0 bytes cache.sqlite.db-wal | Bin 16512 -> 0 bytes .../IPooledRegistrationBuilder.cs | 24 -- src/Autofac.Pooling/PoolActivator.cs | 75 +---- src/Autofac.Pooling/PoolGetActivator.cs | 23 +- .../PooledRegistrationBuilder.cs | 31 -- src/Autofac.Pooling/RegistrationExtensions.cs | 285 ------------------ .../StrategyFactoryOverloadTests.cs | 163 ---------- 14 files changed, 13 insertions(+), 1374 deletions(-) delete mode 100644 .reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt delete mode 100644 .reasonix/truncated-results/1781356494407-a7427901-run_command.txt delete mode 100644 .reasonix/truncated-results/1781364619590-92d833a4-run_command.txt delete mode 100644 .reasonix/truncated-results/1781365172382-60503cc2-run_command.txt delete mode 100644 .reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt delete mode 100644 cache.sqlite.db delete mode 100644 cache.sqlite.db-shm delete mode 100644 cache.sqlite.db-wal delete mode 100644 src/Autofac.Pooling/IPooledRegistrationBuilder.cs delete mode 100644 src/Autofac.Pooling/PooledRegistrationBuilder.cs delete mode 100644 test/Autofac.Pooling.Test/StrategyFactoryOverloadTests.cs diff --git a/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt b/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt deleted file mode 100644 index dfc69a5..0000000 --- a/.reasonix/truncated-results/1781355787144-8bb67aba-run_command.txt +++ /dev/null @@ -1,171 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔══════════════════════════════════════╗ -║ 🎮 Autofac.KeyedResilience Demo ║ -║ HybridCache: FusionCache + SQLite ║ -╚══════════════════════════════════════╝ - -info: NeoSmart.Caching.Sqlite.SqliteCache[0] - Initializing db cache: Data Source=cache.sqlite.db;Mode=ReadWriteCreate;Cache=Shared -─── 演示 1: 从对象池取 Monster ─── -info: Program[0] - 池化怪物: 池化怪物 (Lv.1) - -─── 演示 2: Lazy> ─── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLJ K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLJ K=monsters:all): GetOrDefaultAsync return (default value) - 📂 执行 JSON 加载… -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLK K=monsters:all): SetAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] - -─── 演示 3: Polly 管道(内部 HybridCache → FusionCache → SQLite) ─── -info: Program[0] - Lazy 加载: 毒蘑菇 (Lv.2, 毒) -info: Program[0] - ──── 第 1 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] - -info: Program[0] - 🐉 结果: [mon-007] 毒蘑菇 Lv.2 毒 -info: Program[0] - ──── 第 2 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 🐉 结果: [mon-008] 岩石傀儡 Lv.8 地 - -info: Program[0] - ──── 第 3 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] - -info: Program[0] - 🐉 结果: [mon-002] 火焰精灵 Lv.3 火 -info: Program[0] - ──── 第 4 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFLU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 🐉 结果: [mon-002] 火焰精灵 Lv.3 火 - -info: Program[0] - ──── 第 5 次调用 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 🐉 结果: [mon-008] 岩石傀儡 Lv.8 地 - -─── 演示 4: 缓存验证 ─── -info: Program[0] - ──── 第 1 次调用 GetMonstersAsync ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 📦 拿到 10 个怪物 -info: Program[0] - ──── 第 2 次调用 GetMonstersAsync ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFM7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 📦 拿到 10 个怪物 -info: Program[0] - ──── 第 3 次调用 GetMonstersAsync ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.013634, LEXP=2026-06-23T13:03:07.017837][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:03:07.036716, LEXP=2026-06-23T13:03:07.036727][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99GE6IFLI] (O=0HNM99GE6IFMA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=2026-06-13T13:03:36.885116][] -info: Program[0] - 📦 拿到 10 个怪物 - -─── 演示 5: 池化对象复用 ─── -info: Program[0] - 取出: 池化怪物 -info: Program[0] - 已归还 -info: Program[0] - 再次取出: 池化怪物 - -info: Program[0] - 是否同一个对象: True -🏁 演示结束 diff --git a/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt b/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt deleted file mode 100644 index 1594764..0000000 --- a/.reasonix/truncated-results/1781356494407-a7427901-run_command.txt +++ /dev/null @@ -1,182 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔══════════════════════════════════════╗ -║ 🎮 Autofac.KeyedResilience Demo ║ -║ HybridCache: FusionCache + SQLite ║ -╚══════════════════════════════════════╝ - -─── 演示 1: 怪物池化复用 ─── - -─── 演示 2: Lazy 延迟 Spawn ─── -info: Program[0] - 从池取出空壳 Monster,对象 ID: 17230008 -info: Program[0] - 怪物死亡,归还到池 -info: Program[0] - 新怪物出生,从池取出: 是否同一实例 = True -info: Program[0] - Lazy 还没生成… -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2ST K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2ST K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -─── 演示 3: 批量 Spawn 5 只怪物 ─── - 每个怪物从池取空壳 → 填充随机模板 → 出场 -info: Program[0] - ⚔️ 怪物出场: 雷狼龙 (Lv.4, 雷) -info: Program[0] - ──── 第 1 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2SU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -info: Program[0] - 🐉 [mon-010] 混沌魔王 Lv.12 混沌 ♥200 ⚔30 -info: Program[0] - 💀 怪物死亡,归还到池 -info: Program[0] - ──── 第 2 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -info: Program[0] - 🐉 [mon-006] 圣光骑士 Lv.7 光 ♥90 ⚔14 -info: Program[0] - 💀 怪物死亡,归还到池 -info: Program[0] - ──── 第 3 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-007] 毒蘑菇 Lv.2 毒 ♥25 ⚔7 - -info: Program[0] - 💀 怪物死亡,归还到池 -info: Program[0] - ──── 第 4 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2T7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-003] 冰霜巨人 Lv.5 冰 ♥80 ⚔8 - -info: Program[0] - 💀 怪物死亡,归还到池 -info: Program[0] - ──── 第 5 只怪物出生 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-003] 冰霜巨人 Lv.5 冰 ♥80 ⚔8 - -info: Program[0] - 💀 怪物死亡,归还到池 -─── 演示 4: 怪物模板缓存验证 ─── -info: Program[0] - ──── 第 1 次读取怪物模板 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TD K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TE K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TE K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TF K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TF K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TD K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 📖 拿到了 10 种怪物模板 -info: Program[0] - ──── 第 2 次读取怪物模板 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TG K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TH K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TH K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TI K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TI K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TG K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 📖 拿到了 10 种怪物模板 -info: Program[0] - ──── 第 3 次读取怪物模板 ──── -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TJ K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TK K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TK K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.264427, LEXP=2026-06-23T13:14:54.268563][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TL K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TL K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T13:14:54.287475, LEXP=2026-06-23T13:14:54.287485][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM99N10M2SQ] (O=0HNM99N10M2TJ K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - 📂 JSON 只加载了一次,后续全部走 HybridCache → FusionCache → SQLite -info: Program[0] - 📖 拿到了 10 种怪物模板 - -🏁 演示结束 diff --git a/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt b/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt deleted file mode 100644 index 9a3cf49..0000000 --- a/.reasonix/truncated-results/1781364619590-92d833a4-run_command.txt +++ /dev/null @@ -1,146 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔═══════════════════════════════════╗ -║ Autofac.KeyedResilience Demo ║ -║ FusionCache + SQLite + Polly ║ -╚═══════════════════════════════════╝ - -info: Program[0] - === 1. Lazy 延迟生成 === -info: Program[0] - Lazy 创建了,还没执行… -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL6 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL7 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL7 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL8 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL8 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL6 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - ⚔️ 风暴巨龙 Lv.10 风 - -info: Program[0] - === 2. 批量生成(缓存模板数据) === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL9 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULA K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULA K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULB K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULB K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUL9 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-007] 毒蘑菇 Lv.2 ♥25 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULC K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULD K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULD K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULE K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULE K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULC K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-010] 混沌魔王 Lv.12 ♥200 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULF K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULG K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULG K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULH K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULH K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULF K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULI K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULJ K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULJ K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULK K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULK K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULI K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-004] 雷狼龙 Lv.4 ♥50 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -info: Program[0] - 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 -info: Program[0] - === 3. 缓存验证 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 1 次 → 10 种模板 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 2 次 → 10 种模板 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.425005, LEXP=2026-06-23T15:30:19.429903][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUM0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOUM0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:30:19.454291, LEXP=2026-06-23T15:30:19.454302][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C2MFOUL5] (O=0HNM9C2MFOULU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -(JSON 只加载一次,后续全部走 HybridCache → FusionCache → SQLite) - -🏁 完成 -info: Program[0] - 第 3 次 → 10 种模板 diff --git a/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt b/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt deleted file mode 100644 index 025b011..0000000 --- a/.reasonix/truncated-results/1781365172382-60503cc2-run_command.txt +++ /dev/null @@ -1,146 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔═══════════════════════════════════╗ -║ Autofac.KeyedResilience Demo ║ -║ FusionCache + SQLite + Polly ║ -╚═══════════════════════════════════╝ - -info: Program[0] - === 1. Lazy 延迟生成 === -info: Program[0] - Lazy 已创建,尚未执行… -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNC K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKND K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKND K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNE K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNE K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNC K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - ⚔️ 岩石傀儡 Lv.8 地 - -info: Program[0] - === 2. 批量生成 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNF K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNG K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNG K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNH K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNH K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNF K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-010] 混沌魔王 Lv.12 ♥200 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNI K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNJ K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNJ K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNK K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNK K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNI K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-007] 毒蘑菇 Lv.2 ♥25 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-004] 雷狼龙 Lv.4 ♥50 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-002] 火焰精灵 Lv.3 ♥35 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNR K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNS K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNS K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNT K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNT K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNR K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -info: Program[0] - 🐉 [mon-005] 暗影刺客 Lv.6 ♥40 -info: Program[0] - === 3. 缓存验证 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKNU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 1 次 → 10 种模板 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 2 次 → 10 种模板 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.205239, LEXP=2026-06-23T15:39:32.213350][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T15:39:32.238676, LEXP=2026-06-23T15:39:32.238693][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9C7R7EKNB] (O=0HNM9C7R7EKO4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -(JSON 只加载一次,后续 HybridCache → FusionCache → SQLite) -info: Program[0] - 第 3 次 → 10 种模板 - -🏁 完成 diff --git a/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt b/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt deleted file mode 100644 index 7a19895..0000000 --- a/.reasonix/truncated-results/1781366837259-1fb20d98-run_command.txt +++ /dev/null @@ -1,141 +0,0 @@ -$ dotnet run --project C:\Users\16229\source\OpenSourceLibrary\Autofac.KeyedResilience\demo\Autofac.KeyedResilience.Demo\Autofac.KeyedResilience.Demo.csproj 2>&1 -[exit 0] -╔═══════════════════════════════════╗ -║ Autofac.KeyedResilience Demo ║ -║ FusionCache + SQLite + Polly ║ -╚═══════════════════════════════════╝ - -info: Program[0] - === 1. Lazy 延迟生成 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEL K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEM K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEM K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEN K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEN K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEL K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - ⚔️ 岩石傀儡 Lv.8 -info: Program[0] - === 2. 批量生成 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEO K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEP K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEP K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEQ K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEQ K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEO K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-001] 史莱姆 Lv.1 ♥20 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PER K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PES K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PES K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PET K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PET K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PER K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-001] 史莱姆 Lv.1 ♥20 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEU K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEV K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEV K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF0 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF0 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PEU K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-006] 圣光骑士 Lv.7 ♥90 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF1 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF2 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF2 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF3 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF3 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF1 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-008] 岩石傀儡 Lv.8 ♥120 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF4 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF5 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF5 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF6 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF6 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF4 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 🐉 [mon-002] 火焰精灵 Lv.3 ♥35 -info: Program[0] - === 3. 缓存验证 === -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF7 K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF8 K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF8 K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF9 K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF9 K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PF7 K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 1 次 → 模板已缓存 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFA K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFB K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFB K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFC K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFC K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFA K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] -info: Program[0] - 第 2 次 → 模板已缓存 -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFD K=monsters:all): GetOrDefaultAsync call FEO[DUR=30s LKTO=/ SKMR=N SKMW=Y SKDR=N SKDW=Y SKDRWS=N MDUR=/ DDUR=365000.00:00:00 JIT=0 PR=N SZ=/ FS=N FSMAX=1.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=Y AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFE K=__fc:t:!): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFE K=__fc:t:!): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.095590, LEXP=2026-06-23T16:07:17.103064][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFF K=__fc:t:*): GetOrSetAsync call FEO[DUR=10.00:00:00 LKTO=/ SKMR=N SKMW=N SKDR=N SKDW=N SKDRWS=N MDUR=/ DDUR=10.00:00:00 JIT=0 PR=NR SZ=0 FS=Y FSMAX=10.00:00:00 DFSMAX=/ FSTHR=30s FSTO=/ FHTO=/ TOFC=Y DSTO=/ DHTO=/ ABDO=N SBN=N ABBO=N AC=N] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFF K=__fc:t:*): GetOrSetAsync return FE(M)[T=2026-06-13T16:07:17.124702, LEXP=2026-06-23T16:07:17.124713][S=N, EEXP=/, LM=/, ET=/, S=0, P=NeverRemove] -info: ZiggyCreatures.Caching.Fusion.FusionCache[0] - FUSION [N=FusionCache I=0HNM9CNBD0PEK] (O=0HNM9CNBD0PFD K=monsters:all): GetOrDefaultAsync return FE(M)[T=2026-06-13T13:03:06.885316, LEXP=3025-10-14T13:03:06.885316][] - -🏁 完成 -info: Program[0] - 第 3 次 → 模板已缓存 diff --git a/cache.sqlite.db b/cache.sqlite.db deleted file mode 100644 index 5847ff116ae3495cb18ff1087ae1b2f12d607a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI%&q~8E90%~U6}1KJ5Tu6*hJdhvc<}|?v}m!mS}V?jNbDjG_eX0tHxGh7f^X$Z zco2L9@21@b6-4k_zJdH{(){^-$ffl7$ZaKpUiIP*Pv|Bo5mhByloCQznP+64CQUZ- z&&qV*k6I-gk9Q051#R(_nCFY1vO^ZaeyiIQ z!-z-M;zA5>Tk$As&uj;FEwriQ?br><^5cy9-lT`oilMXdG-gx>>YTN_tUUV(zif++ zNO+pH$x>mh?%I^4UE_H-V#M^&ZiLkHWj=A;b-CJrxBG(Wju+ayb|8BW1LvR?oY8&z ztisYcRijEzop8@T32ES;Iy=u)nX@cQd0EXi&JLRu>d&pSzTDme9!J+a{%!lZ>(|rM zOk&F&hsB~R9(enIM>NtqS4s;c2tWV=5P$##AOHafKmY;|fB*!FDv*BvtL6tWKg_S9 z#)!Be009U<00Izz00bZa0SG_<0>u|t(#o?@EO;WC^Y3r&%2V&t(8~Hi#P_XU7yti@ ae*+L91Rwwb2tWV=5P$##AOHafK;Rpo%Y2;x diff --git a/cache.sqlite.db-shm b/cache.sqlite.db-shm deleted file mode 100644 index 8f39ffd99a7f5a2cce20b73256cf89ad4ed35a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)p$!5t6b9gOKtLkTVj*~Pt1t~?kf5=*0E!V11cSlhSb#t)n$#kp-=8#To2D=C z8{oC~Rmd5HFdN0gIIi>baa!!UTl3mZ_M7>2*&m*lb$@KXe4qbL|GtZq_h}z%hbFFE zKivrd0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!Cu%3#6$NLZD88G;c)+5FkLHE`ecP?dq05A&{ob z2>}8G2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly IK;Sn7J}Rgv6951J diff --git a/cache.sqlite.db-wal b/cache.sqlite.db-wal deleted file mode 100644 index 71a986e74386ac47dcafcd2dad2bb02eb460d46d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16512 zcmeI2&u`mg7{{GtYiXr*AW;Qz!MqaEN;Bjid0*SPFxzohMAon_`$bz#ruDW^HyvqG zHl{IkoDkx|4TN?=;&0%}nG*;JBz6GQ1KJLpk&t*E$8p~{yKqE2R^r(2kLUTmpZ9$u zlND{(Ug}<=V?X{nAwy4%&n8ojBTw1|hynX{e6twE~r4 z(Wu{cbcfA#f-4<$r48?ktyTr1?T7I&Vsp)vPVh#s3MFr?HqW`MSJgLztEU+DS(;x` zFE=}9+ZQ|PYWs4texMd+%jI(6!AnWvL~L>@PNq)Eq}=;qfAeP8e_DF4)%H+LIyOlT z>qoul{V@J_5&?J-m)+Pe`1t4F&;0fEhu_UZSz+Nh1zvOz0U|&IhyW2F0z`la5CI}U z1c<=@iNL4zndL9uo>BIV+RkooZxHqOYGEATWtWoQ#kIA&thvQ%3@T4+n$9Y01%72i z!TOM!4P$+1o1PBWjxV6D741hctLYVX_76A}zrf~5&>eQ4>X24~-cK9*+jBO&HU zhzZ%pLUhQUDXC5>!EiYxX@;t1LItMsO-vG4Q^K&p5gXkDNe(oJVblYAeOL`V_edBB zLPEAg$d+{JP%k6m5H2SSiy#9xs)?}CEu5!`VFMHf%NqapPyXv4`vN~cet7NOhfku! z7dUySz>5wdKm>>Y5g-CYfCvx)B0vO)01+SpMBu+n;KkC+@`=}%KRJB<&u?;m4-5;v zf#YLe;M+f*`TkMu^H*`WiAm##h6Tol(EvlkX*kZ2l>r_KS{YojGSI%rJQgu&WniG3 zm668gCdUj0+9cqbRBeIhAeeGm(BR3O79kuE#v2y8P=@Kk*>lk(O1&sZkMgRLJoKe9 zd0-LAP78+1$+I;dT^xv=2y=u3#)}=e(@qOoV3{y(8DJH0z3Kol*Fkx9fc8=<%o+)E zBw;$R%!Hv)B`d>7Ib~@IgQG78u9@$F8zywkoetPL6dFzSeI&ol!B@>Zn;2hfri%|%#3ayiHlUo5L zB|7EJV91*RTgW;wB4m)gPYj7-ELhfQHTrx3tZXaUBD|^tAfbsyUagK}&eV!JZdu{m zxMe*Knl00o79cLLWVSUBHMU1hxX$J~Z$lnM%xNBNLMN!hin0t1Hm+^^xHjO{wLrPU z8<1ZZqK^C;qblL~*j^KL7|2G2b-Fvz9z4VaGc8O<7hrC3Ti7;Ej00<7_eOU!j01dX zEF5%qds2IcS2@h-MEg#71MKA9Fpewi96SZK6~dEX$^E_Yw;+DK(Ln@=01+SpM1Tko M0U|&Ih(Jo -/// A builder for configuring a pooled registration, returned by . -/// -/// Registration limit type. -/// Activator data type. -/// Registration style. -public interface IPooledRegistrationBuilder - where TSingleRegistrationStyle : SingleRegistrationStyle - where TActivatorData : IConcreteActivatorData - where TLimit : class -{ - /// - /// Gets the registration data for the pooled registration. - /// - RegistrationData RegistrationData { get; } -} diff --git a/src/Autofac.Pooling/PoolActivator.cs b/src/Autofac.Pooling/PoolActivator.cs index f85132d..9a865dd 100644 --- a/src/Autofac.Pooling/PoolActivator.cs +++ b/src/Autofac.Pooling/PoolActivator.cs @@ -15,15 +15,12 @@ namespace Autofac.Pooling; internal sealed class PoolActivator : IInstanceActivator where TLimit : class { - private readonly Service? _pooledInstanceService; - private readonly IPooledRegistrationPolicy? _policy; - private readonly DefaultObjectPoolProvider? _poolProvider; - private readonly Func>? _poolFactory; - private readonly Func>? _policyFactory; + private readonly Service _pooledInstanceService; + private readonly IPooledRegistrationPolicy _policy; + private readonly DefaultObjectPoolProvider _poolProvider; /// - /// Initializes a new instance of the class - /// using the default . + /// Initializes a new instance of the class. /// /// The service used to resolve new instances of the pooled registration. /// The pool policy. @@ -37,37 +34,6 @@ public PoolActivator(Service pooledInstanceService, IPooledRegistrationPolicy - /// Initializes a new instance of the class - /// using a factory function to create the at resolve time. - /// - /// - /// A factory that returns the to use. - /// Invoked during resolve, so the is available - /// for resolving dependencies. - /// - public PoolActivator(Func> poolFactory) - { - _poolFactory = poolFactory ?? throw new ArgumentNullException(nameof(poolFactory)); - } - - /// - /// Initializes a new instance of the class - /// using a factory function to create the at resolve time. - /// The default will create the backing pool. - /// - /// The service used to resolve new instances of the pooled registration. - /// - /// A factory that returns the to use. - /// Invoked during resolve, so the is available - /// for resolving dependencies. - /// - public PoolActivator(Service pooledInstanceService, Func> policyFactory) - { - _pooledInstanceService = pooledInstanceService; - _policyFactory = policyFactory ?? throw new ArgumentNullException(nameof(policyFactory)); - } - /// public Type LimitType { get; } = typeof(TLimit); @@ -76,36 +42,15 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic { pipelineBuilder.Use(PipelinePhase.Activation, (context, next) => { - if (_poolFactory is not null) - { - // Custom pool factory: let the caller create the pool at resolve time. - context.Instance = _poolFactory(context); - } - else if (_policyFactory is not null) - { - // Custom policy factory: resolve the strategy at resolve time, then create DefaultObjectPool. - var policy = _policyFactory(context); - var poolProvider = new DefaultObjectPoolProvider - { - MaximumRetained = policy.MaximumRetained, - }; - var scope = context.Resolve(); - var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService!, scope, policy); - var pool = poolProvider.Create(poolPolicy); - context.Instance = pool; - } - else - { - // Default path: use DefaultObjectPoolProvider + AutofacPooledObjectPolicy. - var scope = context.Resolve(); + // Get a reference to the actual lifetime scope. + var scope = context.Resolve(); - var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService!, scope, _policy!); + var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService, scope, _policy); - // The pool provider will create a disposable pool if the TLimit implements IDisposable. - var pool = _poolProvider!.Create(poolPolicy); + // The pool provider will create a disposable pool if the TLimit implements IDisposable. + var pool = _poolProvider.Create(poolPolicy); - context.Instance = pool; - } + context.Instance = pool; }); } diff --git a/src/Autofac.Pooling/PoolGetActivator.cs b/src/Autofac.Pooling/PoolGetActivator.cs index 91b6490..4bfad02 100644 --- a/src/Autofac.Pooling/PoolGetActivator.cs +++ b/src/Autofac.Pooling/PoolGetActivator.cs @@ -17,8 +17,7 @@ internal sealed class PoolGetActivator : IInstanceActivator where TLimit : class { private readonly PoolService _poolService; - private readonly IPooledRegistrationPolicy? _registrationPolicy; - private readonly Func>? _policyFactory; + private readonly IPooledRegistrationPolicy _registrationPolicy; /// /// Initializes a new instance of the class. @@ -31,21 +30,6 @@ public PoolGetActivator(PoolService poolService, IPooledRegistrationPolicy - /// Initializes a new instance of the class - /// with a factory that resolves the policy at resolve time. - /// - /// The service used to access the pool. - /// - /// A factory that returns the to use. - /// Invoked during resolve with access to the current . - /// - public PoolGetActivator(PoolService poolService, Func> policyFactory) - { - _poolService = poolService; - _policyFactory = policyFactory ?? throw new ArgumentNullException(nameof(policyFactory)); - } - /// public Type LimitType { get; } = typeof(TLimit); @@ -55,7 +39,6 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic pipelineBuilder.Use(PipelinePhase.Activation, (ctxt, next) => { var pool = (ObjectPool)ctxt.ResolveService(_poolService); - var policy = _policyFactory?.Invoke(ctxt) ?? _registrationPolicy!; var didGetFromPool = false; TLimit PoolGet() @@ -64,11 +47,11 @@ TLimit PoolGet() return pool.Get(); } - var poolItem = policy.Get(ctxt, ctxt.Parameters, PoolGet) ?? throw new InvalidOperationException( + var poolItem = _registrationPolicy.Get(ctxt, ctxt.Parameters, PoolGet) ?? throw new InvalidOperationException( string.Format( CultureInfo.CurrentCulture, PoolGetActivatorResources.PolicyMustReturnInstance, - policy.GetType().FullName, + _registrationPolicy.GetType().FullName, typeof(TLimit).FullName)); if (didGetFromPool) diff --git a/src/Autofac.Pooling/PooledRegistrationBuilder.cs b/src/Autofac.Pooling/PooledRegistrationBuilder.cs deleted file mode 100644 index 72d6531..0000000 --- a/src/Autofac.Pooling/PooledRegistrationBuilder.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Autofac Project. All rights reserved. -// Licensed under the MIT License. See LICENSE in the project root for license information. - -using System; -using Autofac.Builder; -using Autofac.Core; - -namespace Autofac.Pooling; - -/// -/// Internal implementation of . -/// -internal sealed class PooledRegistrationBuilder - : IPooledRegistrationBuilder - where TSingleRegistrationStyle : SingleRegistrationStyle - where TActivatorData : IConcreteActivatorData - where TLimit : class -{ - /// - /// Initializes a new instance of the class. - /// - /// The underlying registration builder. - public PooledRegistrationBuilder(IRegistrationBuilder registration) - { - if (registration is null) throw new ArgumentNullException(nameof(registration)); - RegistrationData = registration.RegistrationData; - } - - /// - public RegistrationData RegistrationData { get; } -} diff --git a/src/Autofac.Pooling/RegistrationExtensions.cs b/src/Autofac.Pooling/RegistrationExtensions.cs index 76a040f..689c4f5 100644 --- a/src/Autofac.Pooling/RegistrationExtensions.cs +++ b/src/Autofac.Pooling/RegistrationExtensions.cs @@ -11,7 +11,6 @@ using Autofac.Core.Registration; using Autofac.Core.Resolving.Middleware; using Autofac.Core.Resolving.Pipeline; -using Microsoft.Extensions.ObjectPool; namespace Autofac.Pooling; @@ -139,154 +138,6 @@ public static IRegistrationBuilder - /// Configure the component with a custom pool factory. Must be followed by . - /// - /// Registration limit type. - /// Activator data type. - /// Registration style. - /// The registration. - /// A factory that returns the to use. - /// The registration builder for chaining. - /// - /// Configure the component so that every dependent component or manual resolve within a single - /// will return the same, shared instance, retrieved from a pool of instances shared by all lifetime scopes. - /// When the scope ends, the instance will be returned to the pool. - /// Returns an - /// for further configuration via - /// and . - /// When no additional configuration is provided, defaults apply. - /// - /// Registration limit type. - /// Activator data type. - /// Registration style. - /// The registration. - /// A pooled registration builder for further configuration. - public static IPooledRegistrationBuilder - PooledPerLifetimeScope( - this IRegistrationBuilder registration) - where TSingleRegistrationStyle : SingleRegistrationStyle - where TActivatorData : IConcreteActivatorData - where TLimit : class - { - if (registration == null) throw new ArgumentNullException(nameof(registration)); - - // Lazy routing: defer to registry build time, when Metadata is populated. - var regData = registration.RegistrationData; - regData.Lifetime = new PooledLifetime(); - regData.Sharing = InstanceSharing.None; - - var callback = regData.DeferredCallback - ?? throw new NotSupportedException(RegistrationExtensionsResources.RequiresCallbackContainer); - - if (registration.ActivatorData.Activator is ProvidedInstanceActivator) - throw new NotSupportedException(RegistrationExtensionsResources.CannotUseProvidedInstances); - - var original = callback.Callback; - callback.Callback = registry => - { - if (!(regData.Lifetime is PooledLifetime)) { original(registry); return; } - - // Begin: inlined from RegisterPooled(IPooledRegistrationPolicy) - if (registration.ResolvePipeline.Middleware.Any(c => c is CoreEventMiddleware ev && ev.EventType == ResolveEventType.OnRelease)) - throw new NotSupportedException(RegistrationExtensionsResources.OnReleaseNotSupported); - - var pooledInstanceService = new UniqueService(); - var instanceActivator = registration.ActivatorData.Activator; - - var pooledInstanceRegistration = new ComponentRegistration( - Guid.NewGuid(), instanceActivator, RootScopeLifetime.Instance, - InstanceSharing.None, InstanceOwnership.ExternallyOwned, - registration.ResolvePipeline, - new[] { pooledInstanceService }, - new Dictionary()); - registry.Register(pooledInstanceRegistration); - - var poolService = new PoolService(pooledInstanceRegistration); - - var pf = regData.Metadata.TryGetValue("PoolFactory", out var pv) - ? pv as Func> - : null; - var sf = regData.Metadata.TryGetValue("StrategyFactory", out var sv) - ? sv as Func> - : null; - - if (pf is not null && sf is not null) - { - registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolActivator(pf), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, new[] { poolService }, new Dictionary())); - registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolGetActivator(poolService, sf), CurrentScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, regData.Services, regData.Metadata)); - } - else if (sf is not null) - { - registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolActivator(pooledInstanceService, sf), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, new[] { poolService }, new Dictionary())); - registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolGetActivator(poolService, sf), CurrentScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, regData.Services, regData.Metadata)); - } - else if (pf is not null) - { - registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolActivator(pf), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, new[] { poolService }, new Dictionary())); - registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolGetActivator(poolService, static _ => new DefaultPooledRegistrationPolicy()), CurrentScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, regData.Services, regData.Metadata)); - } - else - { - registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolActivator(pooledInstanceService, new DefaultPooledRegistrationPolicy()), RootScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, new[] { poolService }, new Dictionary())); - registry.Register(new ComponentRegistration(Guid.NewGuid(), new PoolGetActivator(poolService, new DefaultPooledRegistrationPolicy()), CurrentScopeLifetime.Instance, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, regData.Services, regData.Metadata)); - } - - foreach (var srv in regData.Services) - registry.RegisterServiceMiddleware(srv, new PooledInstanceUnpackMiddleware(), MiddlewareInsertionMode.StartOfPhase); - }; - - return new PooledRegistrationBuilder(registration); - } - - /// - /// Sets a custom pool factory on a pooled registration. Must follow . - /// When set, and are controlled by the provided pool. - /// - /// Registration limit type. - /// Activator data type. - /// Registration style. - /// The pooled registration builder. - /// A factory that returns the to use. - /// The pooled registration builder for chaining. - public static IPooledRegistrationBuilder - ConfigurePool( - this IPooledRegistrationBuilder builder, - Func> poolFactory) - where TSingleRegistrationStyle : SingleRegistrationStyle - where TActivatorData : IConcreteActivatorData - where TLimit : class - { - if (builder == null) throw new ArgumentNullException(nameof(builder)); - if (poolFactory == null) throw new ArgumentNullException(nameof(poolFactory)); - builder.RegistrationData.Metadata["PoolFactory"] = poolFactory; - return builder; - } - - /// - /// Sets a custom strategy factory on a pooled registration. Must follow . - /// When set, the strategy's receives full context at resolve time. - /// - /// Registration limit type. - /// Activator data type. - /// Registration style. - /// The pooled registration builder. - /// A factory that returns the to use. - /// The pooled registration builder for chaining. - public static IPooledRegistrationBuilder - ConfigureStrategy( - this IPooledRegistrationBuilder builder, - Func> strategyFactory) - where TSingleRegistrationStyle : SingleRegistrationStyle - where TActivatorData : IConcreteActivatorData - where TLimit : class - { - if (builder == null) throw new ArgumentNullException(nameof(builder)); - if (strategyFactory == null) throw new ArgumentNullException(nameof(strategyFactory)); - builder.RegistrationData.Metadata["StrategyFactory"] = strategyFactory; - return builder; - } - /// /// Configure the component so that every dependent component or manual resolve within /// a tagged with any of the provided tags value gets the same, shared instance, @@ -527,140 +378,4 @@ private static void RegisterPooled( - IRegistrationBuilder registration, - Func> policyFactory, - object[]? tags) - where TSingleRegistrationStyle : SingleRegistrationStyle - where TActivatorData : IConcreteActivatorData - where TLimit : class - { - if (registration == null) throw new ArgumentNullException(nameof(registration)); - if (policyFactory == null) throw new ArgumentNullException(nameof(policyFactory)); - - var regData = registration.RegistrationData; - regData.Lifetime = new PooledLifetime(); - regData.Sharing = InstanceSharing.None; - - var callback = regData.DeferredCallback ?? throw new NotSupportedException(RegistrationExtensionsResources.RequiresCallbackContainer); - if (registration.ActivatorData.Activator is ProvidedInstanceActivator) throw new NotSupportedException(RegistrationExtensionsResources.CannotUseProvidedInstances); - - var original = callback.Callback; - callback.Callback = registry => - { - if (!(regData.Lifetime is PooledLifetime)) { original(registry); return; } - - var pooledInstanceService = new UniqueService(); - var instanceActivator = registration.ActivatorData.Activator; - - if (registration.ResolvePipeline.Middleware.Any(c => c is CoreEventMiddleware ev && ev.EventType == ResolveEventType.OnRelease)) - { - throw new NotSupportedException(RegistrationExtensionsResources.OnReleaseNotSupported); - } - - var pooledInstanceRegistration = new ComponentRegistration( - Guid.NewGuid(), instanceActivator, RootScopeLifetime.Instance, - InstanceSharing.None, InstanceOwnership.ExternallyOwned, - registration.ResolvePipeline, - new[] { pooledInstanceService }, - new Dictionary()); - registry.Register(pooledInstanceRegistration); - - var poolService = new PoolService(pooledInstanceRegistration); - - registry.Register(new ComponentRegistration( - Guid.NewGuid(), - new PoolActivator(pooledInstanceService, policyFactory), - RootScopeLifetime.Instance, InstanceSharing.Shared, - InstanceOwnership.OwnedByLifetimeScope, - new[] { poolService }, - new Dictionary())); - - var pooledGetLifetime = tags is null - ? CurrentScopeLifetime.Instance - : new MatchingScopeLifetime(tags); - - registry.Register(new ComponentRegistration( - Guid.NewGuid(), - new PoolGetActivator(poolService, policyFactory), - pooledGetLifetime, InstanceSharing.Shared, - InstanceOwnership.OwnedByLifetimeScope, - regData.Services, regData.Metadata)); - - foreach (var srv in regData.Services) - { - registry.RegisterServiceMiddleware(srv, new PooledInstanceUnpackMiddleware(), MiddlewareInsertionMode.StartOfPhase); - } - }; - } - - private static void RegisterPooled( - IRegistrationBuilder registration, - Func> poolFactory, - Func> strategyFactory, - object[]? tags) - where TSingleRegistrationStyle : SingleRegistrationStyle - where TActivatorData : IConcreteActivatorData - where TLimit : class - { - if (registration == null) throw new ArgumentNullException(nameof(registration)); - if (poolFactory == null) throw new ArgumentNullException(nameof(poolFactory)); - if (strategyFactory == null) throw new ArgumentNullException(nameof(strategyFactory)); - - var regData = registration.RegistrationData; - regData.Lifetime = new PooledLifetime(); - regData.Sharing = InstanceSharing.None; - - var callback = regData.DeferredCallback ?? throw new NotSupportedException(RegistrationExtensionsResources.RequiresCallbackContainer); - if (registration.ActivatorData.Activator is ProvidedInstanceActivator) throw new NotSupportedException(RegistrationExtensionsResources.CannotUseProvidedInstances); - - var original = callback.Callback; - callback.Callback = registry => - { - if (!(regData.Lifetime is PooledLifetime)) { original(registry); return; } - - var pooledInstanceService = new UniqueService(); - var instanceActivator = registration.ActivatorData.Activator; - - if (registration.ResolvePipeline.Middleware.Any(c => c is CoreEventMiddleware ev && ev.EventType == ResolveEventType.OnRelease)) - { - throw new NotSupportedException(RegistrationExtensionsResources.OnReleaseNotSupported); - } - - var pooledInstanceRegistration = new ComponentRegistration( - Guid.NewGuid(), instanceActivator, RootScopeLifetime.Instance, - InstanceSharing.None, InstanceOwnership.ExternallyOwned, - registration.ResolvePipeline, - new[] { pooledInstanceService }, - new Dictionary()); - registry.Register(pooledInstanceRegistration); - - var poolService = new PoolService(pooledInstanceRegistration); - - registry.Register(new ComponentRegistration( - Guid.NewGuid(), - new PoolActivator(poolFactory), - RootScopeLifetime.Instance, InstanceSharing.Shared, - InstanceOwnership.OwnedByLifetimeScope, - new[] { poolService }, - new Dictionary())); - - var pooledGetLifetime = tags is null - ? CurrentScopeLifetime.Instance - : new MatchingScopeLifetime(tags); - - registry.Register(new ComponentRegistration( - Guid.NewGuid(), - new PoolGetActivator(poolService, strategyFactory), - pooledGetLifetime, InstanceSharing.Shared, - InstanceOwnership.OwnedByLifetimeScope, - regData.Services, regData.Metadata)); - - foreach (var srv in regData.Services) - { - registry.RegisterServiceMiddleware(srv, new PooledInstanceUnpackMiddleware(), MiddlewareInsertionMode.StartOfPhase); - } - }; - } } diff --git a/test/Autofac.Pooling.Test/StrategyFactoryOverloadTests.cs b/test/Autofac.Pooling.Test/StrategyFactoryOverloadTests.cs deleted file mode 100644 index d86aa5b..0000000 --- a/test/Autofac.Pooling.Test/StrategyFactoryOverloadTests.cs +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) Autofac Project. All rights reserved. -// Licensed under the MIT License. See LICENSE in the project root for license information. - -using Autofac.Pooling.Tests.Common; -using Xunit; - -namespace Autofac.Pooling.Test; - -public class StrategyFactoryOverloadTests -{ - [Fact] - public void StrategyFactory_RegistersAndResolves() - { - var builder = new ContainerBuilder(); - - builder.RegisterType() - .As() - .PooledPerLifetimeScope() - .ConfigureStrategy(ctx => new DefaultPooledRegistrationPolicy()); - - var container = builder.Build(); - - using (var scope1 = container.BeginLifetimeScope()) - { - scope1.Resolve(); - } - - using (var scope2 = container.BeginLifetimeScope()) - { - scope2.Resolve(); - } - - container.Dispose(); - } - - [Fact] - public void StrategyFactory_ResolveUsesDefaultObjectPool() - { - var builder = new ContainerBuilder(); - - var trackingPolicy = new PoolTrackingPolicy(); - builder.RegisterInstance(trackingPolicy).As>(); - - builder.RegisterType() - .As() - .PooledPerLifetimeScope() - .ConfigureStrategy(ctx => ctx.Resolve>()); - - var container = builder.Build(); - - using (var scope = container.BeginLifetimeScope()) - { - var instance = scope.Resolve(); - Assert.NotNull(instance); - Assert.IsType(instance); - } - - container.Dispose(); - } - - [Fact] - public void StrategyFactory_MultipleScopesReusesInstance() - { - var builder = new ContainerBuilder(); - - var trackingPolicy = new PoolTrackingPolicy(); - builder.RegisterInstance(trackingPolicy).As>(); - - IPooledService capturedInstance = null!; - - builder.RegisterType() - .As() - .PooledPerLifetimeScope() - .ConfigureStrategy(ctx => ctx.Resolve>()); - - var container = builder.Build(); - - using (var scope1 = container.BeginLifetimeScope()) - { - capturedInstance = scope1.Resolve(); - Assert.Equal(1, capturedInstance.GetCalled); - } - - Assert.Equal(1, capturedInstance.ReturnCalled); - - using (var scope2 = container.BeginLifetimeScope()) - { - var instance2 = scope2.Resolve(); - Assert.Same(capturedInstance, instance2); - Assert.Equal(2, instance2.GetCalled); - } - - Assert.Equal(2, capturedInstance.ReturnCalled); - - container.Dispose(); - } - - [Fact] - public void StrategyFactory_PolicyAcceptsAllReturns() - { - var builder = new ContainerBuilder(); - - var defaultPolicy = new DefaultPooledRegistrationPolicy(); - builder.RegisterInstance(defaultPolicy).As>(); - - builder.RegisterType() - .As() - .PooledPerLifetimeScope() - .ConfigureStrategy(ctx => ctx.Resolve>()); - - var container = builder.Build(); - - using (var scope = container.BeginLifetimeScope()) - { - scope.Resolve(); - } - - using (var scope2 = container.BeginLifetimeScope()) - { - scope2.Resolve(); - } - - container.Dispose(); - } - - [Fact] - public void StrategyFactory_PolicyFactoryReceivesComponentContext() - { - var builder = new ContainerBuilder(); - - var config = new PolicyConfig { MaxRetained = 16 }; - builder.RegisterInstance(config); - - var factoryCalled = false; - - builder.RegisterType() - .As() - .PooledPerLifetimeScope() - .ConfigureStrategy(ctx => - { - factoryCalled = true; - var cfg = ctx.Resolve(); - Assert.Equal(16, cfg.MaxRetained); - return new DefaultPooledRegistrationPolicy(cfg.MaxRetained); - }); - - var container = builder.Build(); - - using (var scope = container.BeginLifetimeScope()) - { - scope.Resolve(); - } - - Assert.True(factoryCalled); - - container.Dispose(); - } - - private class PolicyConfig - { - public int MaxRetained { get; set; } - } -} From 205e983649cb6816d0c0ba6477968d97f8c7b30c Mon Sep 17 00:00:00 2001 From: "1622989459@qq.com" <1622989459@qq.com> Date: Tue, 16 Jun 2026 07:16:31 +0800 Subject: [PATCH 07/10] Address review feedback: share policy instance, revert OnReturnToPool move, add tests Review comments addressed: 1. Share policy instance: PoolActivator calls policyFactory once, stores the resolved policy in a new PooledInstanceContext alongside the pool. PoolGetActivator extracts the policy from the context instead of calling the factory per-resolve. This ensures Get and Return operate on the same policy instance. 2. Revert OnReturnToPool move: Restore OnReturnToPool() call in AutofacPooledObjectPolicy.Return() and remove it from PooledInstanceTracker.Dispose(). This change is unrelated to the factory feature and will be handled in a separate PR if needed. 3. Tests: add non-singleton stateful policy test, null-argument tests for both overloads, and a concurrency test. Removed the weak PolicyFactory_PolicyAcceptsAllReturns test. 4. Clean up double blank line in RegistrationExtensions.cs. 5. PooledInstanceContext.cs: new internal type for sharing the resolved policy instance between pool creation and retrieval. --- .../AutofacPooledObjectPolicy.cs | 5 + src/Autofac.Pooling/PoolActivator.cs | 2 +- src/Autofac.Pooling/PoolGetActivator.cs | 18 ++- src/Autofac.Pooling/PooledInstanceContext.cs | 36 ++++++ src/Autofac.Pooling/PooledInstanceTracker.cs | 5 - src/Autofac.Pooling/RegistrationExtensions.cs | 4 +- .../FactoryOverloadTests.cs | 114 +++++++++++++----- 7 files changed, 137 insertions(+), 47 deletions(-) create mode 100644 src/Autofac.Pooling/PooledInstanceContext.cs diff --git a/src/Autofac.Pooling/AutofacPooledObjectPolicy.cs b/src/Autofac.Pooling/AutofacPooledObjectPolicy.cs index ff88d0c..8b202c4 100644 --- a/src/Autofac.Pooling/AutofacPooledObjectPolicy.cs +++ b/src/Autofac.Pooling/AutofacPooledObjectPolicy.cs @@ -39,6 +39,11 @@ public TPooledObject Create() /// public bool Return(TPooledObject obj) { + if (obj is IPooledComponent poolAwareComponent) + { + poolAwareComponent.OnReturnToPool(); + } + if (_servicePolicy.Return(obj)) { return true; diff --git a/src/Autofac.Pooling/PoolActivator.cs b/src/Autofac.Pooling/PoolActivator.cs index 0e52492..addfe08 100644 --- a/src/Autofac.Pooling/PoolActivator.cs +++ b/src/Autofac.Pooling/PoolActivator.cs @@ -72,7 +72,7 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic var scope = context.Resolve(); var poolPolicy = new AutofacPooledObjectPolicy(_pooledInstanceService!, scope, policy); var pool = poolProvider.Create(poolPolicy); - context.Instance = pool; + context.Instance = new PooledInstanceContext(pool, policy); } else { diff --git a/src/Autofac.Pooling/PoolGetActivator.cs b/src/Autofac.Pooling/PoolGetActivator.cs index 91b6490..145dab6 100644 --- a/src/Autofac.Pooling/PoolGetActivator.cs +++ b/src/Autofac.Pooling/PoolGetActivator.cs @@ -18,7 +18,6 @@ internal sealed class PoolGetActivator : IInstanceActivator { private readonly PoolService _poolService; private readonly IPooledRegistrationPolicy? _registrationPolicy; - private readonly Func>? _policyFactory; /// /// Initializes a new instance of the class. @@ -32,18 +31,13 @@ public PoolGetActivator(PoolService poolService, IPooledRegistrationPolicy - /// Initializes a new instance of the class - /// with a factory that resolves the policy at resolve time. + /// Initializes a new instance of the class. + /// The policy will be retrieved from the at resolve time. /// /// The service used to access the pool. - /// - /// A factory that returns the to use. - /// Invoked during resolve with access to the current . - /// - public PoolGetActivator(PoolService poolService, Func> policyFactory) + public PoolGetActivator(PoolService poolService) { _poolService = poolService; - _policyFactory = policyFactory ?? throw new ArgumentNullException(nameof(policyFactory)); } /// @@ -54,8 +48,10 @@ public void ConfigurePipeline(IComponentRegistryServices componentRegistryServic { pipelineBuilder.Use(PipelinePhase.Activation, (ctxt, next) => { - var pool = (ObjectPool)ctxt.ResolveService(_poolService); - var policy = _policyFactory?.Invoke(ctxt) ?? _registrationPolicy!; + var resolved = ctxt.ResolveService(_poolService); + var ctx = resolved as PooledInstanceContext; + var pool = ctx is not null ? ctx.Pool : (ObjectPool)resolved; + var policy = ctx is not null ? ctx.Policy : _registrationPolicy!; var didGetFromPool = false; TLimit PoolGet() diff --git a/src/Autofac.Pooling/PooledInstanceContext.cs b/src/Autofac.Pooling/PooledInstanceContext.cs new file mode 100644 index 0000000..526b348 --- /dev/null +++ b/src/Autofac.Pooling/PooledInstanceContext.cs @@ -0,0 +1,36 @@ +// Copyright (c) Autofac Project. All rights reserved. +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using Microsoft.Extensions.ObjectPool; + +namespace Autofac.Pooling; + +/// +/// Holds a resolved pool and its associated policy instance, +/// so the policy created during pool construction is shared with the get-side activator. +/// +/// The limit type of the objects in the pool. +internal sealed class PooledInstanceContext + where TLimit : class +{ + /// + /// Initializes a new instance of the class. + /// + /// The object pool. + /// The resolved registration policy. + public PooledInstanceContext(ObjectPool pool, IPooledRegistrationPolicy policy) + { + Pool = pool; + Policy = policy; + } + + /// + /// Gets the object pool. + /// + public ObjectPool Pool { get; } + + /// + /// Gets the resolved registration policy, shared between pool creation and retrieval. + /// + public IPooledRegistrationPolicy Policy { get; } +} diff --git a/src/Autofac.Pooling/PooledInstanceTracker.cs b/src/Autofac.Pooling/PooledInstanceTracker.cs index ed1f7da..0d423fa 100644 --- a/src/Autofac.Pooling/PooledInstanceTracker.cs +++ b/src/Autofac.Pooling/PooledInstanceTracker.cs @@ -39,11 +39,6 @@ public TPooledObject Instance /// public void Dispose() { - if (Instance is IPooledComponent poolAwareComponent) - { - poolAwareComponent.OnReturnToPool(); - } - // Put the instance back in the pool. _pool.Return(Instance); } diff --git a/src/Autofac.Pooling/RegistrationExtensions.cs b/src/Autofac.Pooling/RegistrationExtensions.cs index 0d880e9..13c3301 100644 --- a/src/Autofac.Pooling/RegistrationExtensions.cs +++ b/src/Autofac.Pooling/RegistrationExtensions.cs @@ -489,8 +489,6 @@ private static void RegisterPooled( IRegistrationBuilder registration, Func> policyFactory, @@ -581,7 +579,7 @@ private static void RegisterPooled(poolService, policyFactory), + new PoolGetActivator(poolService), pooledGetLifetime, InstanceSharing.Shared, InstanceOwnership.OwnedByLifetimeScope, diff --git a/test/Autofac.Pooling.Test/FactoryOverloadTests.cs b/test/Autofac.Pooling.Test/FactoryOverloadTests.cs index 2ef3111..2d7506a 100644 --- a/test/Autofac.Pooling.Test/FactoryOverloadTests.cs +++ b/test/Autofac.Pooling.Test/FactoryOverloadTests.cs @@ -1,6 +1,9 @@ // Copyright (c) Autofac Project. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. +using System; +using System.Linq; +using System.Threading.Tasks; using Autofac.Pooling.Tests.Common; using Xunit; @@ -92,33 +95,6 @@ public void PolicyFactory_MultipleScopesReusesInstance() container.Dispose(); } - [Fact] - public void PolicyFactory_PolicyAcceptsAllReturns() - { - var builder = new ContainerBuilder(); - - var defaultPolicy = new DefaultPooledRegistrationPolicy(); - builder.RegisterInstance(defaultPolicy).As>(); - - builder.RegisterType() - .As() - .PooledInstancePerLifetimeScope(ctx => ctx.Resolve>()); - - var container = builder.Build(); - - using (var scope = container.BeginLifetimeScope()) - { - scope.Resolve(); - } - - using (var scope2 = container.BeginLifetimeScope()) - { - scope2.Resolve(); - } - - container.Dispose(); - } - [Fact] public void PolicyFactory_PolicyFactoryReceivesComponentContext() { @@ -176,6 +152,90 @@ public void PolicyFactory_WithMatchingScopeTag() container.Dispose(); } + [Fact] + public void PolicyFactory_NonSingletonPolicySharesSameInstance() + { + // Factory creates a NEW tracking policy instance each time. + // The policy used by PoolActivator (for sizing/Return) must be + // the SAME instance used by PoolGetActivator (for Get). + var builder = new ContainerBuilder(); + + var factoryCallCount = 0; + + builder.RegisterType() + .As() + .PooledInstancePerLifetimeScope(ctx => + { + factoryCallCount++; + return new PoolTrackingPolicy(); + }); + + var container = builder.Build(); + + using (var scope = container.BeginLifetimeScope()) + { + var instance = scope.Resolve(); + Assert.NotNull(instance); + } + + // Factory should have been invoked exactly once (during pool construction). + Assert.Equal(1, factoryCallCount); + + container.Dispose(); + } + + [Fact] + public void PolicyFactory_NullPolicyFactoryThrows() + { + var builder = new ContainerBuilder(); + + var reg = builder.RegisterType() + .As(); + + Assert.Throws(() => + reg.PooledInstancePerLifetimeScope( + (Func>)null!)); + } + + [Fact] + public void PolicyFactory_NullPolicyFactoryWithMatchingScopeThrows() + { + var builder = new ContainerBuilder(); + + var reg = builder.RegisterType() + .As(); + + Assert.Throws(() => + reg.PooledInstancePerMatchingLifetimeScope( + (Func>)null!, + "tag")); + } + + [Fact] + public async Task PolicyFactory_CanUseConcurrently() + { + var builder = new ContainerBuilder(); + + builder.RegisterType() + .As() + .PooledInstancePerLifetimeScope(ctx => new DefaultPooledRegistrationPolicy()); + + var container = builder.Build(); + + var exception = await Record.ExceptionAsync(async () => + { + await Task.WhenAll(Enumerable.Range(0, 100).Select(i => Task.Run(() => + { + using var scope = container.BeginLifetimeScope(); + scope.Resolve(); + }))); + + container.Dispose(); + }); + + Assert.Null(exception); + } + private class PolicyConfig { public int MaxRetained { get; set; } From d510a04bb43677dc2b9ba964756b1cff68f6866b Mon Sep 17 00:00:00 2001 From: "1622989459@qq.com" <1622989459@qq.com> Date: Tue, 16 Jun 2026 09:04:54 +0800 Subject: [PATCH 08/10] Fix test formatting and add assertion for S2699 --- test/Autofac.Pooling.Test/FactoryOverloadTests.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/Autofac.Pooling.Test/FactoryOverloadTests.cs b/test/Autofac.Pooling.Test/FactoryOverloadTests.cs index 2d7506a..e8a25b7 100644 --- a/test/Autofac.Pooling.Test/FactoryOverloadTests.cs +++ b/test/Autofac.Pooling.Test/FactoryOverloadTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Autofac Project. All rights reserved. +// Copyright (c) Autofac Project. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. using System; @@ -22,6 +22,8 @@ public void PolicyFactory_RegistersAndResolves() var container = builder.Build(); + Assert.NotNull(container); + using (var scope1 = container.BeginLifetimeScope()) { scope1.Resolve(); @@ -155,9 +157,6 @@ public void PolicyFactory_WithMatchingScopeTag() [Fact] public void PolicyFactory_NonSingletonPolicySharesSameInstance() { - // Factory creates a NEW tracking policy instance each time. - // The policy used by PoolActivator (for sizing/Return) must be - // the SAME instance used by PoolGetActivator (for Get). var builder = new ContainerBuilder(); var factoryCallCount = 0; @@ -178,7 +177,6 @@ public void PolicyFactory_NonSingletonPolicySharesSameInstance() Assert.NotNull(instance); } - // Factory should have been invoked exactly once (during pool construction). Assert.Equal(1, factoryCallCount); container.Dispose(); @@ -238,6 +236,9 @@ await Task.WhenAll(Enumerable.Range(0, 100).Select(i => Task.Run(() => private class PolicyConfig { - public int MaxRetained { get; set; } + public int MaxRetained + { + get; set; + } } } From ddf5bce1378705959e1245c74324a00fe54e07de Mon Sep 17 00:00:00 2001 From: "1622989459@qq.com" <1622989459@qq.com> Date: Tue, 16 Jun 2026 09:30:08 +0800 Subject: [PATCH 09/10] Add .reasonix/ to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 06a0d50..8eb87ef 100644 --- a/.gitignore +++ b/.gitignore @@ -166,3 +166,6 @@ $RECYCLE.BIN/ # JetBrains Rider .idea + +# Reasonix AI assistant +.reasonix/ From 4ffb10134eb3b110818382ce2f8b9680c08e097e Mon Sep 17 00:00:00 2001 From: "1622989459@qq.com" <1622989459@qq.com> Date: Tue, 16 Jun 2026 09:30:49 +0800 Subject: [PATCH 10/10] Fix PooledInstanceContext property formatting --- src/Autofac.Pooling/PooledInstanceContext.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Autofac.Pooling/PooledInstanceContext.cs b/src/Autofac.Pooling/PooledInstanceContext.cs index 526b348..b0760f2 100644 --- a/src/Autofac.Pooling/PooledInstanceContext.cs +++ b/src/Autofac.Pooling/PooledInstanceContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Autofac Project. All rights reserved. +// Copyright (c) Autofac Project. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. using Microsoft.Extensions.ObjectPool; @@ -27,10 +27,16 @@ public PooledInstanceContext(ObjectPool pool, IPooledRegistrationPolicy< /// /// Gets the object pool. /// - public ObjectPool Pool { get; } + public ObjectPool Pool + { + get; + } /// /// Gets the resolved registration policy, shared between pool creation and retrieval. /// - public IPooledRegistrationPolicy Policy { get; } + public IPooledRegistrationPolicy Policy + { + get; + } }