Document DB v5: New Providers, Versioning, Spatial, Multi-Tenancy, & Multi-DB SupportFeed The Machine Here
Shiny.Extensions.DependencyInjection v3: Turn any DI service into an AI ToolCheck It Out
Client v4.1 BETA: BLE, BLE Hosting, HTTP, Jobs - Linux, MacOS, & Blazor Support! Full AOT support and MANY other features!Check It Out
Controls: Haptic Feedback Anywhere, TableView, Scheduler, ChatView, ImageEditor, and more for MAUI & Blazor!Learn More
Shiny.Health v1: Cross-platform /w Read, Write, & Monitor for steps, heart rate, sleep, and more.Learn More
Shiny.Music v3: Lyrics, Album Art, Playlists, MusicKit and more!Check It Out
Architecture
Shiny is built around three core concepts: Services, Delegates, and Observables. These form the foundation of every Shiny library and understanding them will help you use Shiny effectively.
Shiny is designed as a unified framework — not a collection of independent plugins. Under the hood, it manages storage, logging, platform lifecycle hooks, and cross-platform utilities so you don’t have to.
Services are the primary API you interact with. They are registered with dependency injection and provide the interface for controlling platform features.
// Inject and use services directly
IGpsManagergpsManager; // injected
await gpsManager.StartListener(newGpsRequest
{
UseBackground =true
});
Services follow standard .NET DI patterns — register once, inject anywhere.
Delegates
Delegates are your callback handlers for background events. They are registered at startup and called by Shiny when platform events fire — even when your app isn’t in the foreground.
publicclassMyGpsDelegate : IGpsDelegate
{
publicTaskOnReading(IGpsReadingreading)
{
// Handle GPS reading in background
}
}
Delegates support full dependency injection and are treated as singletons.
Observables
Shiny uses Reactive Extensions (Rx) for real-time event streams. Observables give you powerful composition, filtering, and lifecycle management for platform events.
gpsManager
.WhenReading()
.Where(x=> x.Speed >10)
.Subscribe(reading=> {
// Reactive GPS stream
});
Observables are ideal for UI binding and foreground scenarios.