TrimKit.EventBus
1.1.0
dotnet add package TrimKit.EventBus --version 1.1.0
NuGet\Install-Package TrimKit.EventBus -Version 1.1.0
<PackageReference Include="TrimKit.EventBus" Version="1.1.0" />
<PackageVersion Include="TrimKit.EventBus" Version="1.1.0" />
<PackageReference Include="TrimKit.EventBus" />
paket add TrimKit.EventBus --version 1.1.0
#r "nuget: TrimKit.EventBus, 1.1.0"
#:package TrimKit.EventBus@1.1.0
#addin nuget:?package=TrimKit.EventBus&version=1.1.0
#tool nuget:?package=TrimKit.EventBus&version=1.1.0
TrimKit.EventBus
A lightweight and mutation-safe event bus (event aggregator) for C# applications and games. Designed for simplicity and ease of use.
TrimKit.EventBus allows different parts of your system to communicate via strongly-typed events without hard dependencies or direct references.
Features
- Lightweight & dependency-free.
- Thread-safe.
- Mutation-safe - handlers can safely modify subscriptions even during event publishing.
- Disposable subscriptions - each Subscribe() returns an IDisposable token for easy unsubscribe.
- SubscribeOnce() support - automatically unsubscribes after first event.
- Duplicate protection - prevents duplicate handler registration.
Installation
Use provided nuget package or download the source.
🔧 dotnet add package TrimKit.EventBus
Quick start
Define your events:
public sealed class GameStartedEvent
{
public DateTime StartTime { get; }
public GameStartedEvent(DateTime startTime) => StartTime = startTime;
}
public sealed class CharacterDamagedEvent
{
public string Name { get; }
public int Damage { get; }
public CharacterDamagedEvent(string name, int damage)
{
Name = name;
Damage = damage;
}
}
Create the event bus itself:
var bus = new EventBus();
Add subscribers. You can subscribe normally or use SubscribeOnce() for a one-time handler.
// normal subscription
var token = bus.Subscribe<CharacterDamagedEvent>(e =>
{
Console.WriteLine($"{e.Name} took {e.Damage} damage!");
});
// subscribe once
bus.SubscribeOnce<GameStartedEvent>(e =>
{
Console.WriteLine($"[Once] Game started at {e.StartTime:T}");
});
Each Subscribe() returns an IDisposable token you can later call Dispose() on to unsubscribe:
token.Dispose();
And now you can start publishing events:
bus.Publish(new GameStartedEvent(DateTime.Now));
bus.Publish(new CharacterDamagedEvent("Goblin", 25));
Thread safety
All operations (Subscribe, Unsubscribe, Publish, Reset) are protected by a lock and safe for concurrent use. During event dispatch, handlers are called using a snapshot copy, so you can safely modify subscriptions while publishing.
Event dispatch rules
- Dispatch is by exact event type - base or interface subscribers do not receive derived events.
- Events can be any class or struct (no need for
EventArgs). - Handlers are simple
Action<T>delegates without asenderparameter. You can include the sender information inside the payload itself.
API Overview
| Method | Description |
|---|---|
IDisposable Subscribe<T>(Action<T> handler) |
Subscribe to event T. |
IDisposable SubscribeOnce<T>(Action<T> handler) |
Subscribe for one-time delivery. |
bool Unsubscribe<T>(Action<T> handler) |
Remove specific subscription. |
void Publish<T>(T payload) |
Publish event to all subscribers. |
int GetSubscriberCount<T>() |
Get count of current subscribers for a type. |
bool HasSubscribers<T>() |
Check if any subscribers exist. |
void Clear<T>() |
Remove all subscriptions for a type T. |
void ClearAll() |
Remove all subscriptions. |
Changes
- v1.1 - Switched to using Actions and expanded API.
- v1.0.1 - Fixed namespaces.
- v1.0 - Initial release.
TrimKit Collection
This library is part of the TrimKit collection - a set of small, focused C# libraries that make game development more enjoyable by reducing the need for boilerplate code and providing simple reusable building blocks that can be dropped into any project.
- TrimKit.EventBus - Lightweight, mutation-safe event bus (event aggregator).
- TrimKit.GameSettings - JSON-based persistent settings manager.
- TrimKit.VirtualFileSystem - Unified file hierarchy abstraction to enable modding and additional content in games.
Each module is independent and can be used standalone or combined with others for a complete lightweight foundation.
Contribution
Contributions are welcome!
You can start with submitting an issue on GitHub.
License
This library is released under the MIT License.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.