@@ -18,68 +18,80 @@ This document tracks the implementation of IFileSystemService across the Aspire
1818 - Exposed via FileSystemService property
1919 - Updated AspireStore DI registration
2020 - Updated Locations DI registration
21+
22+ ### Aspire.Hosting Core Files
2123- ✅ Updated ` src/Aspire.Hosting/ApplicationModel/AspireStore.cs `
2224- ✅ Updated ` src/Aspire.Hosting/Dcp/Locations.cs `
2325- ✅ Updated ` src/Aspire.Hosting/Pipelines/PipelineOutputService.cs `
2426- ✅ Updated ` src/Aspire.Hosting/Dashboard/DashboardEventHandlers.cs `
2527- ✅ Updated ` src/Aspire.Hosting/ApplicationModel/ProjectResource.cs `
2628- ✅ Updated ` src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs `
2729
30+ ### MySQL Integration
31+ - ✅ Updated ` src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs `
32+ - Added ` #pragma warning disable ASPIREFILESYSTEM001 `
33+ - Updated ` WritePhpMyAdminConfiguration ` to accept ` IFileSystemService `
34+ - Replaced ` Path.GetTempFileName() ` with ` fileSystemService.TempDirectory.CreateTempFile().Path `
35+
36+ ### MAUI Support
37+ - ✅ Updated ` src/Aspire.Hosting.Maui/Utilities/MauiEnvironmentHelper.cs `
38+ - Added ` #pragma warning disable ASPIREFILESYSTEM001 `
39+ - Updated both ` CreateAndroidEnvironmentTargetsFileAsync ` and ` CreateiOSEnvironmentTargetsFileAsync ` to accept ` IFileSystemService `
40+ - Replaced ` Path.Combine(Path.GetTempPath(), ...) ` with ` fileSystemService.TempDirectory.CreateTempSubdirectory(...).Path `
41+ - ✅ Updated ` src/Aspire.Hosting.Maui/Utilities/MauiAndroidEnvironmentAnnotation.cs `
42+ - Added ` #pragma warning disable ASPIREFILESYSTEM001 `
43+ - Added ` IFileSystemService ` to ` MauiAndroidEnvironmentSubscriber ` constructor
44+ - ✅ Updated ` src/Aspire.Hosting.Maui/Utilities/MauiiOSEnvironmentAnnotation.cs `
45+ - Added ` #pragma warning disable ASPIREFILESYSTEM001 `
46+ - Added ` IFileSystemService ` to ` MauiiOSEnvironmentSubscriber ` constructor
47+
2848## Remaining Files to Update
2949
30- The following files need to be updated using the established pattern:
50+ ### Aspire.Hosting (1 file)
51+ 1 . ** UserSecretsManagerFactory.cs** (line 184)
52+ - Location: ` src/Aspire.Hosting/UserSecrets/UserSecretsManagerFactory.cs `
53+ - Current: ` Path.GetTempFileName() `
54+ - Change: Inject ` IFileSystemService ` and use ` CreateTempFile() `
3155
32- ### Azure Integration
33- 1 . ** AzurePublishingContext.cs**
34- - Location: ` src/Aspire.Hosting.Azure/AzurePublishingContext.cs `
35- - Change: Add ` FileSystemService ` property resolving from service provider
36- - Replace ` Directory.CreateTempSubdirectory("aspire") ` calls
56+ ### Aspire.Hosting.Azure (2 files)
57+ 2 . ** AzureBicepResource.cs** (line 162)
58+ - Location: ` src/Aspire.Hosting.Azure/AzureBicepResource.cs `
59+ - Current: ` Directory.CreateTempSubdirectory("aspire").FullName `
60+ - Challenge: Public method on resource class, not easy to inject services
61+ - Options:
62+ - Set internal ` TempDirectory ` property before calling
63+ - Add optional ` IFileSystemService ` parameter
64+ - Get from service provider in callers
3765
38- 6 . ** BicepProvisioner .cs**
39- - Location: ` src/Aspire.Hosting.Azure/Provisioning/Provisioners/BicepProvisioner .cs `
40- - Change: Inject ` IFileSystemService ` in constructor
41- - Replace ` Directory.CreateTempSubdirectory ` calls
66+ 3 . ** AzureProvisioningResource .cs** (line 83)
67+ - Location: ` src/Aspire.Hosting.Azure/AzureProvisioningResource .cs `
68+ - Current: ` Directory.CreateTempSubdirectory("aspire").FullName `
69+ - Same challenge as AzureBicepResource
4270
43- ### MAUI Support
44- 7 . ** MauiAndroidEnvironmentAnnotation.cs**
45- - Location: ` src/Aspire.Hosting.Maui/Utilities/MauiAndroidEnvironmentAnnotation.cs `
46- - Change: Inject ` IFileSystemService ` in MauiAndroidEnvironmentSubscriber constructor
71+ ### Aspire.Cli (4 files - Out of scope)
72+ The CLI project is separate from the hosting infrastructure. Consider creating a separate ` ICliFileSystemService ` if needed.
4773
48- 8 . ** MauiiOSEnvironmentAnnotation.cs**
49- - Location: ` src/Aspire.Hosting.Maui/Utilities/MauiiOSEnvironmentAnnotation.cs `
50- - Change: Inject ` IFileSystemService ` in MauiiOSEnvironmentSubscriber constructor
74+ 4 . ** InitCommand.cs** (line 265)
75+ - Current: ` Path.Combine(Path.GetTempPath(), $"aspire-init-{Guid.NewGuid()}") `
5176
52- 9 . ** MauiEnvironmentHelper.cs**
53- - Location: ` src/Aspire.Hosting.Maui/Utilities/MauiEnvironmentHelper.cs `
54- - Change: Add directory parameter to helper methods
55- - Remove internal ` Path.Combine(Path.GetTempPath(), ...) ` calls
77+ 5 . ** UpdateCommand.cs** (line 295)
78+ - Current: ` Directory.CreateTempSubdirectory("aspire-cli-extract").FullName `
5679
57- ### MySQL Integration
58- 10 . ** MySqlBuilderExtensions.cs**
59- - Location: ` src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs `
60- - Change: Get ` IFileSystemService ` from service provider in lifecycle hook
61- - Replace ` Path.GetTempFileName() ` with ` CreateTempFile("aspire-phpmyadmin", "config.user.inc.php") `
62-
63- ### User Secrets
64- 11 . ** UserSecretsManagerFactory.cs**
65- - Location: ` src/Aspire.Hosting/UserSecrets/UserSecretsManagerFactory.cs `
66- - Change: Add try/finally around temp file usage to ensure cleanup
67-
68- ### Testing Infrastructure
69- 12 . ** DistributedApplicationTestingBuilder.cs**
70- - Location: ` src/Aspire.Hosting.Testing/DistributedApplicationTestingBuilder.cs `
71- - Change: Forward FileSystemService property in wrapper classes
72-
73- 13 . ** Test Files**
74- - ` tests/Aspire.Hosting.Azure.Tests/AzureBicepProvisionerTests.cs ` - Add IFileSystemService to constructor calls
75- - ` tests/Aspire.Hosting.Tests/AspireStoreTests.cs ` - Update constructor calls
76- - ` tests/Aspire.Hosting.Tests/Dashboard/DashboardLifecycleHookTests.cs ` - Add IFileSystemService
77- - ` tests/Aspire.Hosting.Tests/Dcp/DcpExecutorTests.cs ` - Update Locations constructor
78- - ` tests/Aspire.Hosting.Tests/Dcp/DcpHostNotificationTests.cs ` - Update Locations constructor
79- - ` tests/Aspire.Hosting.Tests/Utils/FileSystemServiceTests.cs ` - CREATE NEW comprehensive test file
80-
81- ### Documentation
82- 14 . ** docs/temp-folder-inventory.md** - CREATE NEW comprehensive documentation file
80+ 6 . ** CliDownloader.cs** (line 58)
81+ - Current: ` Directory.CreateTempSubdirectory("aspire-cli-download").FullName `
82+
83+ 7 . ** TemporaryNuGetConfig.cs** (line 22)
84+ - Current: ` Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()) `
85+
86+ ### Test Files (Many - Out of scope for this PR)
87+ Test files manage their own temp directories for isolation. Key files include:
88+ - ` tests/Shared/TempDirectory.cs ` - Shared test helper that creates temp directories
89+ - ` tests/Shared/DistributedApplicationTestingBuilderExtensions.cs ` - Test configuration
90+ - Various functional tests (Valkey, PostgreSQL, SqlServer, Oracle, MySQL, Redis, etc.)
91+ - Azure tests (AzureContainerAppsTests, AzureAppServiceTests, AzureManifestUtils)
92+ - CLI tests (ConsoleInteractionServiceTests, DiskCacheTests, etc.)
93+
94+ These tests typically use ` Path.GetTempPath() ` or ` Directory.CreateTempSubdirectory() ` directly for test isolation and cleanup
8395
8496## Implementation Pattern
8597
@@ -93,42 +105,42 @@ For each file, follow this pattern:
93105### 2. Inject or resolve IFileSystemService
94106```csharp
95107// Option A: Constructor injection (preferred)
96- public MyClass (IFileSystemService directoryService )
108+ public MyClass (IFileSystemService fileSystemService )
97109{
98- _directoryService = directoryService ;
110+ _fileSystemService = fileSystemService ;
99111}
100112
101113// Option B: Resolve from service provider
102- var directoryService = serviceProvider .GetRequiredService <IFileSystemService >();
114+ var fileSystemService = serviceProvider .GetRequiredService <IFileSystemService >();
103115
104116// Option C: Get from builder
105- var directoryService = builder .ApplicationBuilder .FileSystemService ;
117+ var fileSystemService = builder .ApplicationBuilder .FileSystemService ;
106118```
107119
108120### 3. Replace temp file/directory APIs
109121``` csharp
110122// OLD: Path.GetTempFileName()
111- // NEW: directoryService .TempDirectory.CreateTempFile().Path
123+ // NEW: fileSystemService .TempDirectory.CreateTempFile().Path
112124
113125// OLD: Path.Combine(Path.GetTempPath(), "myfile.ext")
114- // NEW: directoryService .TempDirectory.CreateTempFile("myfile.ext").Path
126+ // NEW: fileSystemService .TempDirectory.CreateTempFile("myfile.ext").Path
115127
116128// OLD: Directory.CreateTempSubdirectory("prefix")
117- // NEW: directoryService .TempDirectory.CreateTempSubdirectory("prefix").Path
129+ // NEW: fileSystemService .TempDirectory.CreateTempSubdirectory("prefix").Path
118130```
119131
120132## Key Adjustments from Original PR #13244
121133
1221341 . ✅ ** Simplified API with optional fileName** : ` CreateTempFile(string? fileName = null) ` - simple temp file creation with optional named file support
1231352 . ✅ ** Removed Documentation** : Removed references to ASPIRE_TEMP_FOLDER and Aspire: TempDirectory configuration
1241363 . ✅ ** Smart parent directory cleanup** : When fileName is provided, automatically cleans up parent directory on dispose
125- 4 . ⏳ ** Line Numbers ** : Need to fix line numbers in docs/temp-folder-inventory.md tables
126- 5 . ⏳ ** Tests ** : Need to create comprehensive FileSystemServiceTests.cs
137+ 4 . ✅ ** MySQL Integration ** : Updated ` MySqlBuilderExtensions.cs ` to use IFileSystemService
138+ 5 . ✅ ** MAUI Integration ** : Updated all MAUI environment helper files to use IFileSystemService
127139
128140## Testing Checklist
129141
130142Before finalizing, ensure:
131- - [ ] All modified files build without warnings
143+ - [x ] All modified files build without warnings
132144- [ ] Existing tests pass
133145- [ ] New FileSystemServiceTests cover all scenarios
134146- [ ] Test disposing TempDirectory and TempFile objects
@@ -144,3 +156,4 @@ Before finalizing, ensure:
144156- ` CreateTempFile("filename.ext") ` creates a temp subdirectory with the named file inside, cleans up both on dispose
145157- ` CreateTempSubdirectory(prefix) ` creates a temp directory that can be disposed to clean up
146158- All APIs are marked ` [Experimental("ASPIREFILESYSTEM001")] `
159+ - CLI files are out of scope for this PR as they don't use the hosting infrastructure
0 commit comments