Skip to content

Commit de3a04c

Browse files
committed
Replace .NET 9 moniker with .NET 10
Upgrade packages +semver:minor
1 parent 75c3f2b commit de3a04c

File tree

7 files changed

+114
-117
lines changed

7 files changed

+114
-117
lines changed

AsyncMemoryCache.Tests/AsyncMemoryCache.Tests.csproj

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net9.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<Nullable>enable</Nullable>
66

77
<IsPackable>false</IsPackable>
@@ -20,31 +20,28 @@
2020
</PropertyGroup>
2121

2222
<ItemGroup>
23-
<PackageReference Include="coverlet.msbuild" Version="6.0.4">
23+
<PackageReference Include="coverlet.msbuild" Version="8.0.0">
2424
<PrivateAssets>all</PrivateAssets>
2525
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2626
</PackageReference>
27-
<PackageReference Include="GitHubActionsTestLogger" Version="2.4.1">
28-
<PrivateAssets>all</PrivateAssets>
29-
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
30-
</PackageReference>
31-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.2" />
32-
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" Version="9.2.0" />
33-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
27+
<PackageReference Include="GitHubActionsTestLogger" Version="3.0.1" />
28+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.5" />
29+
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" Version="10.4.0" />
30+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
3431
<PackageReference Include="NSubstitute" Version="5.3.0" />
3532
<PackageReference Include="NSubstitute.Analyzers.CSharp" Version="1.0.17">
3633
<PrivateAssets>all</PrivateAssets>
3734
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3835
</PackageReference>
39-
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.2">
36+
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
4037
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
4138
<PrivateAssets>all</PrivateAssets>
4239
</PackageReference>
43-
<PackageReference Include="coverlet.collector" Version="6.0.4">
40+
<PackageReference Include="coverlet.collector" Version="8.0.0">
4441
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
4542
<PrivateAssets>all</PrivateAssets>
4643
</PackageReference>
47-
<PackageReference Include="xunit.v3" Version="1.1.0" />
44+
<PackageReference Include="xunit.v3.mtp-v2" Version="3.2.2" />
4845
</ItemGroup>
4946

5047
<ItemGroup>

AsyncMemoryCache.Tests/CacheEntityReferenceExtensionTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class CacheEntityReferenceExtensionTests
1414
public void WithAbsoluteExpirationExtension()
1515
{
1616
var expectedAbsoluteExpiration = DateTimeOffset.UtcNow;
17-
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", () => Task.FromResult((IAsyncDisposable)null!), AsyncLazyFlags.None);
17+
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", () => Task.FromResult<IAsyncDisposable>(null!), AsyncLazyFlags.None);
1818
var cacheEntityReference = new CacheEntityReference<string, IAsyncDisposable>(cacheEntity);
1919

2020
cacheEntityReference.WithAbsoluteExpiration(expectedAbsoluteExpiration);
@@ -28,7 +28,7 @@ public void WithAbsoluteExpirationExtension()
2828
public void WithSlidingExpirationExtension()
2929
{
3030
var expectedSlidingExpirationWindow = TimeSpan.FromMinutes(1);
31-
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", () => Task.FromResult((IAsyncDisposable)null!), AsyncLazyFlags.None);
31+
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", () => Task.FromResult<IAsyncDisposable>(null!), AsyncLazyFlags.None);
3232
var cacheEntityReference = new CacheEntityReference<string, IAsyncDisposable>(cacheEntity);
3333

3434
cacheEntityReference.WithSlidingExpiration(expectedSlidingExpirationWindow);
@@ -43,7 +43,7 @@ public void WithExpirationStrategyExtension()
4343
{
4444
var expirationStrategy = Substitute.For<IExpirationStrategy>();
4545

46-
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", () => Task.FromResult((IAsyncDisposable)null!), AsyncLazyFlags.None);
46+
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", () => Task.FromResult<IAsyncDisposable>(null!), AsyncLazyFlags.None);
4747
var cacheEntityReference = new CacheEntityReference<string, IAsyncDisposable>(cacheEntity);
4848

4949
cacheEntityReference.WithExpirationStrategy(expirationStrategy);
@@ -56,7 +56,7 @@ public void WithExpirationCallbackExtension()
5656
{
5757
var expirationCallback = (string _, IAsyncDisposable _) => { };
5858

59-
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", () => Task.FromResult((IAsyncDisposable)null!), AsyncLazyFlags.None);
59+
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", () => Task.FromResult<IAsyncDisposable>(null!), AsyncLazyFlags.None);
6060
var cacheEntityReference = new CacheEntityReference<string, IAsyncDisposable>(cacheEntity);
6161

6262
cacheEntityReference.WithExpirationCallback(expirationCallback);

AsyncMemoryCache.Tests/CacheEntityReferenceTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class CacheEntityReferenceTests
1010
[Fact]
1111
public void IncrementsAndDecrementsProperly()
1212
{
13-
var cacheEntity = new CacheEntity<string, IAsyncDisposable>(string.Empty, () => Task.FromResult((IAsyncDisposable)null!), AsyncLazyFlags.None);
13+
var cacheEntity = new CacheEntity<string, IAsyncDisposable>(string.Empty, () => Task.FromResult<IAsyncDisposable>(null!), AsyncLazyFlags.None);
1414
Assert.Equal(0, cacheEntity.References);
1515

1616
var cacheEntityReference = new CacheEntityReference<string, IAsyncDisposable>(cacheEntity);
@@ -23,7 +23,7 @@ public void IncrementsAndDecrementsProperly()
2323
[Fact]
2424
public void MultipleDisposes_DecrementsOnlyOnce()
2525
{
26-
var cacheEntity = new CacheEntity<string, IAsyncDisposable>(string.Empty, () => Task.FromResult((IAsyncDisposable)null!), AsyncLazyFlags.None);
26+
var cacheEntity = new CacheEntity<string, IAsyncDisposable>(string.Empty, () => Task.FromResult<IAsyncDisposable>(null!), AsyncLazyFlags.None);
2727
Assert.Equal(0, cacheEntity.References);
2828

2929
var cacheEntityReference = new CacheEntityReference<string, IAsyncDisposable>(cacheEntity);

AsyncMemoryCache.Tests/CacheItemFactoryInvokerTests.cs

Lines changed: 64 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -9,96 +9,95 @@
99
using System.Threading.Tasks;
1010
using Xunit;
1111

12-
namespace AsyncMemoryCache.Tests
12+
namespace AsyncMemoryCache.Tests;
13+
14+
public class CacheItemFactoryInvokerTests
1315
{
14-
public class CacheItemFactoryInvokerTests
16+
[Fact]
17+
public void InvokeFactory_ShouldInvokeObjectFactoryAfterDelay()
1518
{
16-
[Fact]
17-
public void InvokeFactory_ShouldInvokeObjectFactoryAfterDelay()
19+
using var syncContext = new SingleThreadSynchronizationContext();
20+
21+
var manualResetEvent = new ManualResetEvent(false);
22+
23+
var factory = () =>
1824
{
19-
using var syncContext = new SingleThreadSynchronizationContext();
25+
manualResetEvent.Set();
26+
return Task.FromResult(Substitute.For<IAsyncDisposable>());
27+
};
2028

21-
var manualResetEvent = new ManualResetEvent(false);
29+
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", factory, AsyncLazyFlags.None);
2230

23-
var factory = () =>
24-
{
25-
manualResetEvent.Set();
26-
return Task.FromResult(Substitute.For<IAsyncDisposable>());
27-
};
31+
var creationTimeProvider = Substitute.For<ICreationTimeProvider>();
32+
var timeProvider = new FakeTimeProvider();
33+
var expectedCreationTime = timeProvider.GetUtcNow().AddMilliseconds(100);
34+
creationTimeProvider.GetExpectedCreationTime().Returns(expectedCreationTime);
2835

29-
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", factory, AsyncLazyFlags.None);
36+
CacheItemFactoryInvoker.InvokeFactory(cacheEntity, creationTimeProvider, timeProvider);
3037

31-
var creationTimeProvider = Substitute.For<ICreationTimeProvider>();
32-
var timeProvider = new FakeTimeProvider();
33-
var expectedCreationTime = timeProvider.GetUtcNow().AddMilliseconds(100);
34-
creationTimeProvider.GetExpectedCreationTime().Returns(expectedCreationTime);
38+
syncContext.RunOnCurrentThread();
3539

36-
CacheItemFactoryInvoker.InvokeFactory(cacheEntity, creationTimeProvider, timeProvider);
40+
Assert.False(cacheEntity.ObjectFactory.IsStarted);
41+
timeProvider.Advance(TimeSpan.FromMilliseconds(99));
42+
Assert.False(cacheEntity.ObjectFactory.IsStarted);
43+
timeProvider.Advance(TimeSpan.FromMilliseconds(100));
3744

38-
syncContext.RunOnCurrentThread();
45+
manualResetEvent.WaitOne();
46+
Assert.True(cacheEntity.ObjectFactory.IsStarted);
47+
}
3948

40-
Assert.False(cacheEntity.ObjectFactory.IsStarted);
41-
timeProvider.Advance(TimeSpan.FromMilliseconds(99));
42-
Assert.False(cacheEntity.ObjectFactory.IsStarted);
43-
timeProvider.Advance(TimeSpan.FromMilliseconds(100));
49+
[Fact]
50+
public void InvokeFactory_ShouldInvokeObjectFactoryImmediatelyIfNoDelay()
51+
{
52+
using var syncContext = new SingleThreadSynchronizationContext();
4453

45-
manualResetEvent.WaitOne();
46-
Assert.True(cacheEntity.ObjectFactory.IsStarted);
47-
}
54+
var manualResetEvent = new ManualResetEvent(false);
4855

49-
[Fact]
50-
public void InvokeFactory_ShouldInvokeObjectFactoryImmediatelyIfNoDelay()
56+
var factory = () =>
5157
{
52-
using var syncContext = new SingleThreadSynchronizationContext();
58+
manualResetEvent.Set();
59+
return Task.FromResult(Substitute.For<IAsyncDisposable>());
60+
};
5361

54-
var manualResetEvent = new ManualResetEvent(false);
62+
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", factory, AsyncLazyFlags.None);
5563

56-
var factory = () =>
57-
{
58-
manualResetEvent.Set();
59-
return Task.FromResult(Substitute.For<IAsyncDisposable>());
60-
};
64+
var sw = Stopwatch.StartNew();
65+
CacheItemFactoryInvoker.InvokeFactory(cacheEntity, CreationTimeProvider.Default, TimeProvider.System);
6166

62-
var cacheEntity = new CacheEntity<string, IAsyncDisposable>("test", factory, AsyncLazyFlags.None);
67+
syncContext.RunOnCurrentThread();
6368

64-
var sw = Stopwatch.StartNew();
65-
CacheItemFactoryInvoker.InvokeFactory(cacheEntity, CreationTimeProvider.Default, TimeProvider.System);
69+
manualResetEvent.WaitOne();
70+
Assert.InRange(sw.ElapsedMilliseconds, 0, 50);
71+
}
6672

67-
syncContext.RunOnCurrentThread();
73+
private class SingleThreadSynchronizationContext : SynchronizationContext, IDisposable
74+
{
75+
private readonly Queue<(SendOrPostCallback, object?)> _queue = new();
76+
private readonly SynchronizationContext? _originalContext;
6877

69-
manualResetEvent.WaitOne();
70-
Assert.InRange(sw.ElapsedMilliseconds, 0, 50);
78+
public SingleThreadSynchronizationContext()
79+
{
80+
_originalContext = Current;
81+
SetSynchronizationContext(this);
7182
}
7283

73-
private class SingleThreadSynchronizationContext : SynchronizationContext, IDisposable
84+
public override void Post(SendOrPostCallback d, object? state)
7485
{
75-
private readonly Queue<(SendOrPostCallback, object?)> _queue = new();
76-
private readonly SynchronizationContext? _originalContext;
77-
78-
public SingleThreadSynchronizationContext()
79-
{
80-
_originalContext = Current;
81-
SetSynchronizationContext(this);
82-
}
83-
84-
public override void Post(SendOrPostCallback d, object? state)
85-
{
86-
_queue.Enqueue((d, state));
87-
}
86+
_queue.Enqueue((d, state));
87+
}
8888

89-
public void RunOnCurrentThread()
89+
public void RunOnCurrentThread()
90+
{
91+
while (_queue.Count > 0)
9092
{
91-
while (_queue.Count > 0)
92-
{
93-
var (callback, state) = _queue.Dequeue();
94-
callback(state);
95-
}
93+
var (callback, state) = _queue.Dequeue();
94+
callback(state);
9695
}
96+
}
9797

98-
public void Dispose()
99-
{
100-
SetSynchronizationContext(_originalContext);
101-
}
98+
public void Dispose()
99+
{
100+
SetSynchronizationContext(_originalContext);
102101
}
103102
}
104-
}
103+
}

AsyncMemoryCache.Tests/EvictionBehaviorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public async Task DefaultEvictionBehavior_CallsCallbacks_ForExpiredItem()
289289
var globalCacheItemExpiredCallbackCalled = false;
290290
var config = new AsyncMemoryCacheConfiguration<string, IAsyncDisposable>
291291
{
292-
CacheItemExpired = (string _, IAsyncDisposable _) => globalCacheItemExpiredCallbackCalled = true,
292+
CacheItemExpired = (_, _) => globalCacheItemExpiredCallbackCalled = true,
293293
CacheBackingStore = cache,
294294
};
295295

AsyncMemoryCache/AsyncMemoryCache.csproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net9.0;net8.0;netstandard2.0;net462</TargetFrameworks>
4+
<TargetFrameworks>net10.0;net8.0;netstandard2.0;net462</TargetFrameworks>
55
<Nullable>enable</Nullable>
66

77
<LangVersion>latest</LangVersion>
@@ -44,19 +44,15 @@
4444
</PackageReference>
4545
</ItemGroup>
4646

47-
<ItemGroup Condition="$(TargetFramework) == 'net462'">
48-
<PackageReference Include="System.ValueTuple" Version="4.4.0" />
49-
</ItemGroup>
50-
5147
<ItemGroup>
52-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.2" />
48+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.5" />
5349
<PackageReference Include="Nito.AsyncEx.Coordination" Version="5.1.2" />
5450

55-
<PackageReference Include="Roslynator.Analyzers" Version="4.13.0">
51+
<PackageReference Include="Roslynator.Analyzers" Version="4.15.0">
5652
<PrivateAssets>all</PrivateAssets>
5753
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
5854
</PackageReference>
59-
<PackageReference Include="Roslynator.Formatting.Analyzers" Version="4.13.0">
55+
<PackageReference Include="Roslynator.Formatting.Analyzers" Version="4.15.0">
6056
<PrivateAssets>all</PrivateAssets>
6157
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
6258
</PackageReference>
@@ -67,4 +63,8 @@
6763
<None Include="..\README.md" Pack="true" PackagePath="\" />
6864
</ItemGroup>
6965

66+
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
67+
<PackageReference Include="System.ValueTuple" Version="4.6.2" />
68+
</ItemGroup>
69+
7070
</Project>

AsyncMemoryCache/Extensions/ServiceCollectionExtensions.cs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,42 @@ namespace AsyncMemoryCache.Extensions;
99
/// </summary>
1010
public static class ServiceCollectionExtensions
1111
{
12-
/// <summary>
13-
/// Adds the default <see cref="IAsyncMemoryCache{TKey, TValue}"/> implementation and related services to the <see cref="IServiceCollection"/>.
14-
/// </summary>
15-
/// <typeparam name="TKey">The type of the key to be used for each cache item.</typeparam>
16-
/// <typeparam name="TValue">The type of the value which will be cached</typeparam>
17-
/// <param name="services">The <see cref="IServiceCollection"/>.</param>
18-
/// <returns>The <see cref="IServiceCollection"/>.</returns>
19-
public static IServiceCollection AddAsyncMemoryCache<TKey, TValue>(this IServiceCollection services)
20-
where TKey : notnull
21-
where TValue : IAsyncDisposable
12+
extension(IServiceCollection services)
2213
{
23-
return services
14+
/// <summary>
15+
/// Adds the default <see cref="IAsyncMemoryCache{TKey, TValue}"/> implementation and related services to the <see cref="IServiceCollection"/>.
16+
/// </summary>
17+
/// <typeparam name="TKey">The type of the key to be used for each cache item.</typeparam>
18+
/// <typeparam name="TValue">The type of the value which will be cached</typeparam>
19+
/// <returns>The <see cref="IServiceCollection"/>.</returns>
20+
public IServiceCollection AddAsyncMemoryCache<TKey, TValue>()
21+
where TKey : notnull
22+
where TValue : IAsyncDisposable
23+
{
24+
return services
2425
.AddSingleton<IAsyncMemoryCache<TKey, TValue>>(
2526
sp => AsyncMemoryCache<TKey, TValue>.Create(
2627
sp.GetRequiredService<IAsyncMemoryCacheConfiguration<TKey, TValue>>(),
2728
sp.GetService<ILogger<AsyncMemoryCache<TKey, TValue>>>()))
2829
.AddSingleton<IAsyncMemoryCacheConfiguration<TKey, TValue>, AsyncMemoryCacheConfiguration<TKey, TValue>>();
29-
}
30+
}
3031

31-
/// <summary>
32-
/// Adds the default <see cref="IAsyncMemoryCache{TKey, TValue}"/> implementation and related services to the <see cref="IServiceCollection"/> with a custom <see cref="IAsyncMemoryCacheConfiguration{TKey, TValue}"/> object.
33-
/// </summary>
34-
/// <typeparam name="TKey">The type of the key to be used for each cache item.</typeparam>
35-
/// <typeparam name="TValue">The type of the value which will be cached</typeparam>
36-
/// <param name="services">The <see cref="IServiceCollection"/>.</param>
37-
/// <param name="configuration">The custom configuration object.</param>
38-
/// <returns>The <see cref="IServiceCollection"/></returns>
39-
public static IServiceCollection AddAsyncMemoryCache<TKey, TValue>(this IServiceCollection services, IAsyncMemoryCacheConfiguration<TKey, TValue> configuration)
40-
where TKey : notnull
41-
where TValue : IAsyncDisposable
42-
{
43-
return services
32+
/// <summary>
33+
/// Adds the default <see cref="IAsyncMemoryCache{TKey, TValue}"/> implementation and related services to the <see cref="IServiceCollection"/> with a custom <see cref="IAsyncMemoryCacheConfiguration{TKey, TValue}"/> object.
34+
/// </summary>
35+
/// <typeparam name="TKey">The type of the key to be used for each cache item.</typeparam>
36+
/// <typeparam name="TValue">The type of the value which will be cached</typeparam>
37+
/// <param name="configuration">The custom configuration object.</param>
38+
/// <returns>The <see cref="IServiceCollection"/></returns>
39+
public IServiceCollection AddAsyncMemoryCache<TKey, TValue>(IAsyncMemoryCacheConfiguration<TKey, TValue> configuration)
40+
where TKey : notnull
41+
where TValue : IAsyncDisposable
42+
{
43+
return services
4444
.AddSingleton<IAsyncMemoryCache<TKey, TValue>>(
4545
sp => AsyncMemoryCache<TKey, TValue>.Create(
4646
configuration,
4747
sp.GetService<ILogger<AsyncMemoryCache<TKey, TValue>>>()));
48+
}
4849
}
4950
}

0 commit comments

Comments
 (0)