![]() |
VOOZH | about |
dotnet add package CShells --version 0.0.28
NuGet\Install-Package CShells -Version 0.0.28
<PackageReference Include="CShells" Version="0.0.28" />
<PackageVersion Include="CShells" Version="0.0.28" />Directory.Packages.props
<PackageReference Include="CShells" />Project file
paket add CShells --version 0.0.28
#r "nuget: CShells, 0.0.28"
#:package CShells@0.0.28
#addin nuget:?package=CShells&version=0.0.28Install as a Cake Addin
#tool nuget:?package=CShells&version=0.0.28Install as a Cake Tool
A modular multi-tenancy framework for .NET that enables building feature-based applications with isolated services, configuration, and background workers.
CShells is the core runtime package that provides blueprint-driven shell activation, cooperative drain-based reload, feature discovery, per-shell DI containers, and configuration-driven multi-tenancy.
appsettings.json or codeInitializing → Active → Deactivating → Draining → Drained → DisposedIShellRegistry.ReloadAsync(name) builds the next generation while draining the previous one; in-flight request scopes finish against the old providerIShellLifecycleSubscriber receives every state transitiondotnet add package CShells
using CShells.Features;
using Microsoft.Extensions.DependencyInjection;
[ShellFeature("Core", DisplayName = "Core Services")]
public class CoreFeature : IShellFeature
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ITimeService, TimeService>();
}
}
{
"CShells": {
"Shells": {
"Default": {
"Features": { "Core": {} }
}
}
}
}
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddCShells(cshells =>
cshells.WithConfigurationProvider(builder.Configuration));
var app = builder.Build();
app.Run();
IShell.BeginScope() returns a tracked IShellScope that (a) exposes a scoped IServiceProvider built from the shell's container and (b) delays drain-handler invocation while the scope is outstanding:
public class ShellBackgroundWorker(IShellRegistry registry) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
foreach (var name in registry.GetBlueprintNames())
{
var shell = registry.GetActive(name);
if (shell is null) continue;
await using var scope = shell.BeginScope();
var service = scope.ServiceProvider.GetService<IMyService>();
service?.Execute();
}
await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
}
}
}
builder.Services.AddCShells(cshells =>
{
cshells.AddShell("Default", shell => shell
.WithFeatures("Core", "Weather")
.WithConfiguration("Theme", "Dark")
.WithConfiguration("MaxItems", "100"));
});
Register IShellInitializer services for per-shell startup work and IDrainHandler services for cooperative shutdown:
public class PaymentsFeature : IShellFeature
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IPaymentProcessor, StripePaymentProcessor>();
services.AddShellInitializer<RunPaymentMigrations>(
LifecyclePhase.Prepare,
order: 100);
services.AddShellInitializer<StartPaymentProcessor>(
LifecyclePhase.Start,
order: 100);
services.AddTransient<IDrainHandler, PaymentsDrainHandler>();
}
}
Initializers run sequentially during Initializing -> Active. Existing direct IShellInitializer registrations still run in DI-registration order in LifecyclePhase.Default; AddShellInitializer<T>() adds explicit phase/order metadata and registers the initializer as transient. Drain handlers run in parallel during Draining, after all outstanding IShellScope handles have been released or the drain deadline elapses.
var result = await registry.ReloadAsync("payments");
// result.NewShell.Descriptor.Generation == previous + 1
// result.Drain (when non-null) is the cooperative drain on the previous generation.
if (result.Drain is not null)
await result.Drain.WaitAsync();
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 5 NuGet packages that depend on CShells:
| Package | Downloads |
|---|---|
|
CShells.AspNetCore
ASP.NET Core integration for CShells. Provides middleware and extensions for shell/tenant resolution based on HTTP context, including host-based and route-based strategies for modular multi-tenant applications. |
|
|
CShells.Providers.FluentStorage
FluentStorage integration provider for CShells. Enables loading and persisting shell configurations from various storage backends (Azure Blob, AWS S3, disk, memory, etc.) supported by FluentStorage. |
|
|
Elsa.Shells.Api
Provides API endpoints for shell management. |
|
|
Elsa.Diagnostics.StructuredLogs.Persistence.Relational
Provides shared relational persistence services for diagnostics structured logs. |
|
|
Elsa.Diagnostics.ConsoleLogs
Provides live raw console log streaming for Elsa hosts. |
Showing the top 1 popular GitHub repositories that depend on CShells:
| Repository | Stars |
|---|---|
|
elsa-workflows/elsa-core
The Workflow Engine for .NET
|
| Version | Downloads | Last Updated |
|---|---|---|
| 0.0.28 | 213 | 6/12/2026 |
| 0.0.27 | 172 | 6/12/2026 |
| 0.0.26 | 165 | 6/12/2026 |
| 0.0.25 | 172 | 6/11/2026 |
| 0.0.24 | 384 | 5/15/2026 |
| 0.0.23 | 171 | 5/15/2026 |
| 0.0.22 | 173 | 5/14/2026 |
| 0.0.21 | 177 | 5/12/2026 |
| 0.0.20 | 189 | 5/8/2026 |
| 0.0.19 | 171 | 5/6/2026 |
| 0.0.18 | 178 | 5/2/2026 |
| 0.0.17 | 177 | 4/29/2026 |
| 0.0.16 | 184 | 4/27/2026 |
| 0.0.15 | 170 | 4/27/2026 |
| 0.0.14 | 656 | 4/20/2026 |
| 0.0.13 | 166 | 4/17/2026 |
| 0.0.12 | 251 | 3/16/2026 |
| 0.0.11 | 335 | 2/28/2026 |
| 0.0.10 | 182 | 2/24/2026 |
| 0.0.9 | 442 | 2/15/2026 |