Skip to content

Registries

CapabilityScope maintains two optional registries that cache composers and compositions for later retrieval.

Two Registries

RegistryStoresPurpose
ComposersComposer instancesRetrieve a builder after creation (e.g., for recomposition)
CompositionsIComposition resultsRetrieve completed compositions by subject

Both are enabled by default.

Configuring Registries

csharp
var scope = new CapabilityScope(new CapabilityScopeOptions
{
    UseComposerRegistry = true,     // default: true
    UseCompositionRegistry = true,  // default: true
});

CompositionRegistryApi

csharp
// Try-pattern
if (scope.Compositions.TryGet("my-subject", out var composition))
{
    var caps = composition.GetAll<ICapability>();
}

// Get or default (returns null)
var comp = scope.Compositions.GetOrDefault("my-subject");

// Get required (throws)
var comp = scope.Compositions.GetRequired("my-subject");

// Generic overloads
var comp = scope.Compositions.GetRequired<string>("my-subject");

// Remove
scope.Compositions.Remove("my-subject");

ComposerRegistryApi

csharp
// Try-pattern
if (scope.Composers.TryGet("my-subject", out var composer))
{
    // Composer still available
}

// Get or default
var c = scope.Composers.GetOrDefault("my-subject");

// Get required (throws)
var c = scope.Composers.GetRequired("my-subject");

// Register manually
scope.Composers.Register("key", composer, forceRegister: false);

// Remove
scope.Composers.Remove("my-subject");

Per-Operation Override

Override the default registry behavior for individual operations:

csharp
// Compose but don't register the composer
var composer = scope.Compose("temp-subject", useRegistry: false);

// Build but don't register the composition
var composition = composer.Build(useRegistry: false);

Reference Types vs Value Types

Registry storage differs by subject type:

Subject TypeStorageLifetimeCleanup
Reference types (classes)ConditionalWeakTableWeak — GC cleans upAutomatic when subject is collected
Value types (structs, enums)ConcurrentDictionaryStrong — persistsManual via Remove()

WARNING

Value-type subjects (e.g., enums, structs) persist in the registry for the scope's lifetime. If you register many value-type subjects dynamically, call Remove() when they're no longer needed.

Registry Decision Matrix

ScenarioComposer RegistryComposition Registry
Standard usageOnOn
Fire-and-forget compositionsOffOn
Temporary compositionsOffOff
Need to recompose laterOnOn

Released under the Apache-2.0 License.