Skip to content

Commit 762dccb

Browse files
authored
Fix InvalidateAll to remove all cache entries and add tests (#1141)
* Fix InvalidateAll to remove all cache entries and add tests Updated SqliteBlobCache.InvalidateAll to delete all cache entries, not just untyped ones. Added comprehensive tests for InvalidateAll behavior, including typed, untyped, and expired entries. Upgraded several dependencies in Directory.Packages.props and updated sample ViewModels to use System.Reactive.Disposables.Fluent. Updated solution file for Visual Studio 18. * Update Windows target version to 10.0.19041.0 Bump the Windows-specific target framework and supported OS platform version from 10.0.17763.0 to 10.0.19041.0 in Directory.Build.props and AkavacheTodoMaui.csproj to align with newer Windows SDK requirements. * Update to .NET 10 RC, MAUI, and Microsoft.Extensions 10 Add global.json to pin .NET SDK 10.0.100-rc.2.25502.107. Update Microsoft.Extensions package versions to 10.0.0 in Directory.Packages.props and add Microsoft.Maui.Controls.Compatibility. Comment out the Windows target framework in AkavacheTodoMaui.csproj. Update Akavache.sln to reference the new global.json location.
1 parent ad0a1af commit 762dccb

12 files changed

Lines changed: 225 additions & 105 deletions

File tree

global.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"sdk": {
3+
"version": "10.0.100-rc.2.25502.107",
4+
"rollForward": "latestFeature",
5+
"allowPrerelease": true
6+
}
7+
}

src/Akavache.Core/Core/AkavacheBuilder.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,11 @@ public string? SettingsCachePath
7373
get
7474
{
7575
// Lazy computation to ensure ApplicationName is properly set via WithApplicationName()
76-
if (_settingsCachePath == null)
77-
{
78-
_settingsCachePath = _fileLocationOption switch
76+
_settingsCachePath ??= _fileLocationOption switch
7977
{
8078
FileLocationOption.Legacy => this.GetLegacyCacheDirectory("SettingsCache"),
8179
_ => this.GetIsolatedCacheDirectory("SettingsCache"),
8280
};
83-
}
8481

8582
return _settingsCachePath;
8683
}

src/Akavache.Sqlite3/SqliteBlobCache.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -795,8 +795,7 @@ public IObservable<Unit> InvalidateAll()
795795
{
796796
await Connection.RunInTransactionAsync(sql =>
797797
{
798-
var entries = sql.Table<CacheEntry>().Where(x => x.TypeName == null).ToList();
799-
foreach (var key in entries)
798+
foreach (var key in sql.Table<CacheEntry>().ToList())
800799
{
801800
sql.Delete<CacheEntry>(key.Id);
802801
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright (c) 2025 .NET Foundation and Contributors. All rights reserved.
2+
// Licensed to the .NET Foundation under one or more agreements.
3+
// The .NET Foundation licenses this file to you under the MIT license.
4+
// See the LICENSE file in the project root for full license information.
5+
6+
using Akavache.Sqlite3;
7+
using Akavache.SystemTextJson;
8+
using Akavache.Tests.Helpers;
9+
using NUnit.Framework;
10+
11+
namespace Akavache.Tests;
12+
13+
/// <summary>
14+
/// Tests focused on SqliteBlobCache.InvalidateAll behavior.
15+
/// </summary>
16+
[NonParallelizable]
17+
[TestFixture]
18+
[Category("Akavache")]
19+
public class SqliteBlobCacheInvalidateAllTests
20+
{
21+
private static readonly TimeSpan Timeout = TimeSpan.FromSeconds(10);
22+
23+
/// <summary>
24+
/// Verifies that InvalidateAll removes all untyped items and they cannot be retrieved afterwards.
25+
/// </summary>
26+
/// <returns>A task to await.</returns>
27+
[Test]
28+
public async Task InvalidateAll_ShouldRemove_AllItems()
29+
{
30+
var serializer = new SystemJsonSerializer();
31+
using (Utility.WithEmptyDirectory(out var path))
32+
await using (var cache = new SqliteBlobCache(Path.Combine(path, "invalidateall-basic.db"), serializer))
33+
{
34+
// Arrange
35+
await cache.Insert("a", [1]).Timeout(Timeout).FirstAsync();
36+
await cache.Insert("b", [2]).Timeout(Timeout).FirstAsync();
37+
await cache.Insert("c", [3]).Timeout(Timeout).FirstAsync();
38+
39+
var keysBefore = await cache.GetAllKeys().ToList().Timeout(Timeout).FirstAsync();
40+
Assert.That(keysBefore, Has.Count.EqualTo(3));
41+
42+
// Act
43+
await cache.InvalidateAll().Timeout(Timeout).FirstAsync();
44+
45+
// Assert
46+
var keysAfter = await cache.GetAllKeys().ToList().Timeout(Timeout).FirstAsync();
47+
Assert.That(keysAfter, Is.Empty);
48+
49+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("a").Timeout(Timeout).FirstAsync());
50+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("b").Timeout(Timeout).FirstAsync());
51+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("c").Timeout(Timeout).FirstAsync());
52+
}
53+
}
54+
55+
/// <summary>
56+
/// Verifies that InvalidateAll removes both typed and untyped items.
57+
/// </summary>
58+
/// <returns>A task to await.</returns>
59+
[Test]
60+
public async Task InvalidateAll_ShouldRemove_TypedAndUntypedItems()
61+
{
62+
var serializer = new SystemJsonSerializer();
63+
using (Utility.WithEmptyDirectory(out var path))
64+
await using (var cache = new SqliteBlobCache(Path.Combine(path, "invalidateall-mixed.db"), serializer))
65+
{
66+
// Arrange: mix typed and untyped entries
67+
await cache.Insert("u1", [1]).Timeout(Timeout).FirstAsync();
68+
await cache.Insert("u2", [2]).Timeout(Timeout).FirstAsync();
69+
70+
var userType = typeof(string);
71+
await cache.Insert("t1", [10], userType).Timeout(Timeout).FirstAsync();
72+
await cache.Insert("t2", [20], userType).Timeout(Timeout).FirstAsync();
73+
74+
var keysBefore = await cache.GetAllKeys().ToList().Timeout(Timeout).FirstAsync();
75+
Assert.That(keysBefore, Has.Count.EqualTo(4));
76+
77+
// Act
78+
await cache.InvalidateAll().Timeout(Timeout).FirstAsync();
79+
80+
// Assert
81+
var keysAfter = await cache.GetAllKeys().ToList().Timeout(Timeout).FirstAsync();
82+
Assert.That(keysAfter, Is.Empty);
83+
84+
// Both typed and untyped should be gone
85+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("u1").Timeout(Timeout).FirstAsync());
86+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("u2").Timeout(Timeout).FirstAsync());
87+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("t1", userType).Timeout(Timeout).FirstAsync());
88+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("t2", userType).Timeout(Timeout).FirstAsync());
89+
}
90+
}
91+
92+
/// <summary>
93+
/// Verifies that InvalidateAll clears all items even when some entries are expired and filtered from GetAllKeys.
94+
/// </summary>
95+
/// <returns>A task to await.</returns>
96+
[Test]
97+
public async Task InvalidateAll_ShouldIgnore_ExpiredEntriesButStillClearAll()
98+
{
99+
var serializer = new SystemJsonSerializer();
100+
using (Utility.WithEmptyDirectory(out var path))
101+
await using (var cache = new SqliteBlobCache(Path.Combine(path, "invalidateall-expired.db"), serializer))
102+
{
103+
// Arrange: one expired, one not
104+
await cache.Insert("live", [1], DateTimeOffset.Now.AddMinutes(5)).Timeout(Timeout).FirstAsync();
105+
await cache.Insert("expired", [2], DateTimeOffset.Now.AddMilliseconds(200)).Timeout(Timeout).FirstAsync();
106+
107+
// wait for expiration
108+
await Task.Delay(300);
109+
110+
var keysBefore = await cache.GetAllKeys().ToList().Timeout(Timeout).FirstAsync();
111+
112+
// live remains, expired filtered out by GetAllKeys — keysBefore may be 1
113+
Assert.That(keysBefore, Has.Count.LessThanOrEqualTo(1));
114+
115+
// Act
116+
await cache.InvalidateAll().Timeout(Timeout).FirstAsync();
117+
118+
// Assert
119+
var keysAfter = await cache.GetAllKeys().ToList().Timeout(Timeout).FirstAsync();
120+
Assert.That(keysAfter, Is.Empty);
121+
122+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("live").Timeout(Timeout).FirstAsync());
123+
Assert.ThrowsAsync<KeyNotFoundException>(async () => await cache.Get("expired").Timeout(Timeout).FirstAsync());
124+
}
125+
}
126+
}

src/Akavache.sln

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 17
4-
VisualStudioVersion = 17.2.32616.157
3+
# Visual Studio Version 18
4+
VisualStudioVersion = 18.0.11217.181
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9407D902-E9CF-4CB6-B601-77CDF74B9475}"
77
ProjectSection(SolutionItems) = preProject
88
..\.github\workflows\ci-build.yml = ..\.github\workflows\ci-build.yml
99
Directory.Build.props = Directory.Build.props
1010
Directory.Build.targets = Directory.Build.targets
1111
Directory.Packages.props = Directory.Packages.props
12-
global.json = global.json
12+
..\global.json = ..\global.json
1313
Migration.md = Migration.md
1414
..\README.md = ..\README.md
1515
..\.github\workflows\release.yml = ..\.github\workflows\release.yml

src/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<AkavacheCrossPlatformNet9>net9.0</AkavacheCrossPlatformNet9>
3636

3737
<!-- Windows-specific desktop TFMs (includes Windows-specific .NET 9) -->
38-
<AkavacheWindowsDesktopTargets>net462;net472;net9.0-windows10.0.17763.0</AkavacheWindowsDesktopTargets>
38+
<AkavacheWindowsDesktopTargets>net462;net472;net9.0-windows10.0.19041.0</AkavacheWindowsDesktopTargets>
3939

4040
<!-- Mobile TFMs separated by platform -->
4141
<AkavacheMobileAndroidTargets>net9.0-android</AkavacheMobileAndroidTargets>

src/Directory.Packages.props

Lines changed: 80 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,83 @@
11
<Project>
2-
<PropertyGroup>
3-
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
4-
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
5-
</PropertyGroup>
6-
7-
<!-- Version groups for packages that share the same version -->
8-
<PropertyGroup>
9-
<MicrosoftExtensionsVersion>9.0.8</MicrosoftExtensionsVersion>
10-
<SqlitePclRawVersion>2.1.11</SqlitePclRawVersion>
11-
<SqliteNetVersion>1.9.172</SqliteNetVersion>
12-
<SplatVersion>16.2.1</SplatVersion>
13-
<ReactiveUIVersion>20.4.1</ReactiveUIVersion>
14-
</PropertyGroup>
15-
16-
<!-- All projects -->
17-
<ItemGroup>
18-
<PackageVersion Include="Nerdbank.GitVersioning" Version="3.9.50" />
19-
<PackageVersion Include="stylecop.analyzers" Version="1.2.0-beta.556" />
20-
<PackageVersion Include="Roslynator.Analyzers" Version="4.14.1" />
21-
</ItemGroup>
22-
23-
<!-- Non-test projects only -->
24-
<ItemGroup Condition="'$(IsTestProject)' != 'true' and '$(SourceLinkEnabled)' != 'false'">
25-
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
26-
</ItemGroup>
27-
28-
<!-- Test projects only -->
29-
<ItemGroup Condition="'$(IsTestProject)' == 'true'">
30-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
31-
<PackageVersion Include="NUnit" Version="4.4.0" />
32-
<PackageVersion Include="NUnit3TestAdapter" Version="5.2.0" />
33-
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
2+
<PropertyGroup>
3+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
4+
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
5+
</PropertyGroup>
6+
<!-- Version groups for packages that share the same version -->
7+
<PropertyGroup>
8+
<MicrosoftExtensionsVersion>10.0.0</MicrosoftExtensionsVersion>
9+
<SqlitePclRawVersion>2.1.11</SqlitePclRawVersion>
10+
<SqliteNetVersion>1.9.172</SqliteNetVersion>
11+
<SplatVersion>17.1.1</SplatVersion>
12+
<ReactiveUIVersion>22.2.1</ReactiveUIVersion>
13+
</PropertyGroup>
14+
<!-- All projects -->
15+
<ItemGroup>
16+
<PackageVersion Include="Nerdbank.GitVersioning" Version="3.9.50" />
17+
<PackageVersion Include="stylecop.analyzers" Version="1.2.0-beta.556" />
18+
<PackageVersion Include="Roslynator.Analyzers" Version="4.14.1" />
19+
</ItemGroup>
20+
<!-- Non-test projects only -->
21+
<ItemGroup Condition="'$(IsTestProject)' != 'true' and '$(SourceLinkEnabled)' != 'false'">
22+
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
23+
</ItemGroup>
24+
<!-- Test projects only -->
25+
<ItemGroup Condition="'$(IsTestProject)' == 'true'">
26+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
27+
<PackageVersion Include="NUnit" Version="4.4.0" />
28+
<PackageVersion Include="NUnit3TestAdapter" Version="5.2.0" />
29+
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
3430
<PackageVersion Include="coverlet.msbuild" Version="6.0.4" />
35-
<PackageVersion Include="ReactiveUI.Testing" Version="$(ReactiveUIVersion)" />
36-
<PackageVersion Include="NUnit.Analyzers" Version="4.11.2" />
37-
</ItemGroup>
38-
39-
<!-- Core library packages -->
40-
<ItemGroup>
41-
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="$(MicrosoftExtensionsVersion)" />
42-
<PackageVersion Include="Splat.Builder" Version="$(SplatVersion)" />
43-
<PackageVersion Include="System.Reactive" Version="6.0.2" />
44-
<PackageVersion Include="sqlite-net-pcl" Version="$(SqliteNetVersion)" />
45-
<PackageVersion Include="SQLitePCLRaw.bundle_green" Version="$(SqlitePclRawVersion)" />
46-
<PackageVersion Include="System.Text.Json" Version="$(MicrosoftExtensionsVersion)" />
47-
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
48-
<PackageVersion Include="Newtonsoft.Json.Bson" Version="1.0.3" />
49-
<PackageVersion Include="sqlite-net-sqlcipher" Version="$(SqliteNetVersion)" />
50-
<PackageVersion Include="SQLitePCLRaw.bundle_e_sqlcipher" Version="$(SqlitePclRawVersion)" />
51-
<PackageVersion Include="Splat.Drawing" Version="$(SplatVersion)" />
52-
</ItemGroup>
53-
54-
<!-- .NET Framework-specific packages -->
55-
<ItemGroup Condition="'$(TargetFramework)' == 'net462' OR '$(TargetFramework)' == 'net472'">
56-
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
57-
</ItemGroup>
58-
59-
<!-- Test-specific packages -->
60-
<ItemGroup>
61-
<PackageVersion Include="SQLitePCLRaw.lib.e_sqlcipher" Version="$(SqlitePclRawVersion)" />
62-
<PackageVersion Include="SQLitePCLRaw.lib.e_sqlite3" Version="$(SqlitePclRawVersion)" />
63-
</ItemGroup>
64-
65-
<!-- Benchmark packages -->
66-
<ItemGroup>
67-
<PackageVersion Include="BenchmarkDotNet" Version="0.15.6" />
68-
<PackageVersion Include="Akavache.Sqlite3" Version="11.1.1" />
69-
<PackageVersion Include="Akavache" Version="11.1.1" />
70-
</ItemGroup>
71-
72-
<!-- Sample application packages -->
73-
<ItemGroup>
74-
<PackageVersion Include="ReactiveUI.SourceGenerators" Version="2.4.1" />
75-
<PackageVersion Include="ReactiveUI.WPF" Version="$(ReactiveUIVersion)" />
76-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(MicrosoftExtensionsVersion)" />
77-
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsVersion)" />
78-
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsVersion)" />
79-
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="$(MicrosoftExtensionsVersion)" />
80-
<PackageVersion Include="ReactiveUI.Maui" Version="$(ReactiveUIVersion)" />
81-
</ItemGroup>
82-
83-
<!-- MAUI-specific package -->
84-
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'
85-
OR $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'
86-
OR $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'
87-
OR $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">
88-
<PackageVersion Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
89-
</ItemGroup>
90-
91-
<!-- Windows-specific packages for MAUI -->
92-
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">
93-
<PackageVersion Include="Microsoft.WindowsAppSDK" Version="1.7.250606001" />
94-
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.4948" />
95-
</ItemGroup>
31+
<PackageVersion Include="ReactiveUI.Testing" Version="$(ReactiveUIVersion)" />
32+
<PackageVersion Include="NUnit.Analyzers" Version="4.11.2" />
33+
</ItemGroup>
34+
<!-- Core library packages -->
35+
<ItemGroup>
36+
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="$(MicrosoftExtensionsVersion)" />
37+
<PackageVersion Include="Splat.Builder" Version="$(SplatVersion)" />
38+
<PackageVersion Include="System.Reactive" Version="6.1.0" />
39+
<PackageVersion Include="sqlite-net-pcl" Version="$(SqliteNetVersion)" />
40+
<PackageVersion Include="SQLitePCLRaw.bundle_green" Version="$(SqlitePclRawVersion)" />
41+
<PackageVersion Include="System.Text.Json" Version="$(MicrosoftExtensionsVersion)" />
42+
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
43+
<PackageVersion Include="Newtonsoft.Json.Bson" Version="1.0.3" />
44+
<PackageVersion Include="sqlite-net-sqlcipher" Version="$(SqliteNetVersion)" />
45+
<PackageVersion Include="SQLitePCLRaw.bundle_e_sqlcipher" Version="$(SqlitePclRawVersion)" />
46+
<PackageVersion Include="Splat.Drawing" Version="$(SplatVersion)" />
47+
</ItemGroup>
48+
<!-- .NET Framework-specific packages -->
49+
<ItemGroup Condition="'$(TargetFramework)' == 'net462' OR '$(TargetFramework)' == 'net472'">
50+
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
51+
</ItemGroup>
52+
<!-- Test-specific packages -->
53+
<ItemGroup>
54+
<PackageVersion Include="SQLitePCLRaw.lib.e_sqlcipher" Version="$(SqlitePclRawVersion)" />
55+
<PackageVersion Include="SQLitePCLRaw.lib.e_sqlite3" Version="$(SqlitePclRawVersion)" />
56+
</ItemGroup>
57+
<!-- Benchmark packages -->
58+
<ItemGroup>
59+
<PackageVersion Include="BenchmarkDotNet" Version="0.15.6" />
60+
<PackageVersion Include="Akavache.Sqlite3" Version="11.4.1" />
61+
<PackageVersion Include="Akavache" Version="11.4.1" />
62+
</ItemGroup>
63+
<!-- Sample application packages -->
64+
<ItemGroup>
65+
<PackageVersion Include="ReactiveUI.SourceGenerators" Version="2.5.1" />
66+
<PackageVersion Include="ReactiveUI.WPF" Version="$(ReactiveUIVersion)" />
67+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(MicrosoftExtensionsVersion)" />
68+
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsVersion)" />
69+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsVersion)" />
70+
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="$(MicrosoftExtensionsVersion)" />
71+
<PackageVersion Include="ReactiveUI.Maui" Version="$(ReactiveUIVersion)" />
72+
</ItemGroup>
73+
<!-- MAUI-specific package -->
74+
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android' OR $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios' OR $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst' OR $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">
75+
<PackageVersion Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
76+
<PackageVersion Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
77+
</ItemGroup>
78+
<!-- Windows-specific packages for MAUI -->
79+
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">
80+
<PackageVersion Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" />
81+
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7175" />
82+
</ItemGroup>
9683
</Project>

src/Samples/AkavacheTodoMaui/AkavacheTodoMaui.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>net9.0-android</TargetFrameworks>
5-
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net9.0-windows10.0.19041.0</TargetFrameworks>
5+
<!--<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net9.0-windows10.0.19041.0</TargetFrameworks>-->
66

77
<OutputType>Exe</OutputType>
88
<IsPackable>false</IsPackable>
@@ -32,7 +32,7 @@
3232
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">15.0</SupportedOSPlatformVersion>
3333
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">15.0</SupportedOSPlatformVersion>
3434
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
35-
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
35+
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.19041.0</SupportedOSPlatformVersion>
3636
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
3737
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
3838
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

src/Samples/AkavacheTodoMaui/ViewModels/MainViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Collections.ObjectModel;
77
using System.Diagnostics.CodeAnalysis;
88
using System.Reactive.Disposables;
9+
using System.Reactive.Disposables.Fluent;
910
using AkavacheTodoMaui.Models;
1011
using AkavacheTodoMaui.Services;
1112
using ReactiveUI;

0 commit comments

Comments
 (0)