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.