fluentcms / fluentcms/FluentCMS.Infrastructure
[Design] PluginSystemOptions.RegisteredALCs is hidden mutable state — side-channel coupling between PluginLoader and PluginManager
- Dominant language
- C#
- Stars
- 0
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
## Summary
`PluginSystemOptions` contains an `internal` mutable list of `AssemblyLoadContext` instances (`RegisteredALCs`). This list is populated by `PluginLoader` and consumed by `PluginManager`. Using a public options/configuration object as a hidden communication channel between two components is an anti-pattern: the options class should carry only configuration values, not mutable runtime state.
## Location
`Plugins/FluentCMS.Infrastructure.Plugins/PluginSystemOptions.cs` — line 51
## Problematic Code
```csharp
internal List RegisteredALCs { get; } = [];
```
## Impact
- **Hidden coupling:** `PluginLoader` and `PluginManager` are implicitly coupled through the shared options object with no documented contract.
- **Unexpected mutation:** Any component that holds a reference to `PluginSystemOptions` can observe or modify the ALC list, which should be an implementation detail.
- **Testing difficulty:** Creating a `PluginSystemOptions` instance in tests doesn't give the expected clean state without knowing about this hidden list.
- **Violation of SRP:** `PluginSystemOptions` now serves two roles: configuration data-bag and runtime ALC registry.
## Recommendation
Remove `RegisteredALCs` from `PluginSystemOptions` and change `LoadPluginTypes` to return a result type that packages both outputs together:
```csharp
public record PluginLoadResult(
IReadOnlyList PluginTypes,
IReadOnlyList LoadContexts
);
// PluginLoader.LoadPluginTypes() returns PluginLoadResult
// PluginManager receives PluginLoadResult directly
```
This makes the data-flow explicit and removes the hidden state from the configuration object.
## Severity
🔵 **Design / Maintainability**
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.