Skip to content

Getting Started

Install:

bash
dotnet add package Cocoar.Capabilities

All types are in the Cocoar.Capabilities namespace.

Quick Start: Compose and Query

A subject is any object you compose capabilities onto — it's the key that identifies a composition in the registry. Subjects can be strings, class instances, enum values, or any other object.

csharp
using Cocoar.Capabilities;

// 1. Create a scope
var scope = new CapabilityScope();

// 2. Compose capabilities onto a subject (here, the string "user-service")
scope.Compose("user-service")
    .Add(new LoggingCapability { Level = LogLevel.Debug })
    .Add(new RetryCapability { MaxAttempts = 3 })
    .Build();

// 3. Query the composition
var composition = scope.Compositions.GetRequired<string>("user-service");

var logging = composition.GetFirstOrDefault<LoggingCapability>();
Console.WriteLine(logging?.Level); // Debug

var all = composition.GetAll<RetryCapability>();
Console.WriteLine(composition.Has<LoggingCapability>()); // True

Quick Start: Primary Capability

csharp
public record ServiceIdentity(string Name, string Version) : IPrimaryCapability;

scope.Compose("user-service")
    .WithPrimary(new ServiceIdentity("UserService", "2.1.0"))
    .Add(new LoggingCapability { Level = LogLevel.Debug })
    .Build();

var composition = scope.Compositions.GetRequired<string>("user-service");
var identity = composition.GetRequiredPrimaryAs<ServiceIdentity>();
Console.WriteLine(identity.Name); // UserService

Quick Start: Multiple Contracts

csharp
public class EmailNotifier : INotifier, IHealthCheck
{
    public string Name => "Email";
    public bool IsHealthy => true;
}

scope.Compose("notifications")
    .AddAs<(INotifier, IHealthCheck)>(new EmailNotifier()) // tuple = register under both interfaces
    .Build();

var composition = scope.Compositions.GetRequired<string>("notifications");
var notifiers = composition.GetAll<INotifier>();      // [EmailNotifier]
var checks = composition.GetAll<IHealthCheck>();       // [EmailNotifier]

Key Types

TypeRole
CapabilityScopeContainer that manages composers and compositions
ComposerFluent builder for attaching capabilities to a subject
ICompositionImmutable, thread-safe result of a composition
IPrimaryCapabilityMarker interface for the "identity" capability
CapabilityScopeOptionsConfiguration for scope behavior

Next Steps

Released under the Apache-2.0 License.