fluentcms / fluentcms/FluentCMS.Infrastructure

[Design] PluginSystemOptions.RegisteredALCs is hidden mutable state — side-channel coupling between PluginLoader and PluginManager

Open
#16 0 comments 0 reactions 0 assignees View on GitHub
enhancement
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.