Plugin system for DotCompute compute acceleration framework. Provides hot-reload capability, plugin discovery, circuit breaker patterns, and fault tolerance infrastructure.
$ dotnet add package DotCompute.PluginsA robust, extensible plugin system for DotCompute that enables dynamic loading of backend implementations with full isolation, hot-reload support, and comprehensive lifecycle management.
dotnet add package DotCompute.Plugins --version 0.5.3
var host = Host.CreateDefaultBuilder(args)
.UsePlugins(builder => builder
.SetPluginsDirectory("./plugins")
.EnableHotReload()
.SetHealthCheckInterval(TimeSpan.FromMinutes(1))
.EnableMetrics())
.Build();
[Plugin("my.plugin", "My Custom Plugin")]
[PluginCapability("compute.custom", Version = "1.0.0")]
public class MyPlugin : BackendPluginBase
{
public override string Id => "my.plugin";
public override string Name => "My Custom Plugin";
public override Version Version => new(1, 0, 0);
public override string Description => "A custom compute backend";
public override string Author => "Your Name";
public override PluginCapabilities Capabilities =>
PluginCapabilities.ComputeBackend | PluginCapabilities.HotReloadable;
protected override async Task OnInitializeAsync(CancellationToken cancellationToken)
{
// Initialize your plugin
Logger?.LogInformation("Initializing My Plugin");
}
protected override Task OnStartAsync(CancellationToken cancellationToken)
{
// Start your plugin services
return Task.CompletedTask;
}
protected override Task OnStopAsync(CancellationToken cancellationToken)
{
// Stop your plugin services
return Task.CompletedTask;
}
}
{
"Plugins": {
"PluginsDirectory": "./plugins",
"EnableHotReload": true,
"HealthCheckInterval": "00:01:00",
"my.plugin": {
"Enabled": true,
"Settings": {
"CustomOption": "value"
}
}
}
}
Unknown → Loading → Loaded → Initializing → Initialized → Starting → Running
↓
Unloaded ← Unloading ← Stopped ← Stopping ←─────────────────────────────┘
Plugins can declare various capabilities:
ComputeBackend: Provides compute functionalityStorageProvider: Provides storage servicesNetworkProvider: Provides networking servicesSecurityProvider: Provides security servicesMonitoringProvider: Provides monitoring capabilitiesHotReloadable: Supports hot reloadScalable: Supports horizontal scalingClusterable: Supports clusteringEnable hot reload for development:
builder.EnableHotReload()
.ConfigureLoader(options =>
{
options.EnableHotReload = true;
options.ReloadDelay = TimeSpan.FromMilliseconds(500);
});
Set resource limits per plugin:
builder.SetResourceLimits(maxMemoryMB: 512, maxCpuPercent: 50);
Add shared assemblies and probing paths:
builder.AddSharedAssemblies("MyShared.dll")
.AddProbingPaths("./lib", "./dependencies");
Access plugin health and metrics:
var manager = serviceProvider.GetRequiredService<PluginManager>();
var stats = manager.GetStatistics();
var metrics = manager.GetPlugin("my.plugin")?.GetMetrics();
Discover plugins in a directory:
var discoveries = await pluginLoader.DiscoverPluginsAsync("./plugins");
foreach (var discovery in discoveries.Where(d => d.Success))
{
Console.WriteLine($"Found: {discovery.AssemblyName}");
foreach (var plugin in discovery.PluginTypes)
{
Console.WriteLine($" - {plugin.Id}: {plugin.Name} v{plugin.Version}");
}
}
Enable sandboxing for untrusted plugins:
builder.EnableSandboxing()
.ConfigureManager(options =>
{
options.ValidateSignatures = true;
options.TrustedCertificateThumbprints.Add("THUMBPRINT");
});
Configure plugin permissions:
{
"PluginSecurity": {
"my.plugin": {
"AllowFileSystemAccess": false,
"AllowNetworkAccess": true,
"AllowedNetworkEndpoints": ["https://api.example.com"]
}
}
}
See the Examples folder for complete plugin examples:
ExampleBackendPlugin.cs: Basic plugin implementationComputePlugin.cs: Compute backend pluginStoragePlugin.cs: Storage provider pluginMonitoringPlugin.cs: Monitoring provider pluginIBackendPlugin[Plugin] attribute is presentSupportsHotReload = trueComprehensive documentation is available for DotCompute:
When contributing plugins: