Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1442830
feat: initialize project structure with Mediator pattern and basic co…
elyosemite Nov 20, 2025
d2b69a9
Merge pull request #4 from elyosemite/feat/init
elyosemite Nov 20, 2025
f06eb09
feat: add build task and define IPublish and ISend interfaces; remove…
elyosemite Nov 24, 2025
e84146c
feat: implement ConsumeContext class for message handling
elyosemite Nov 26, 2025
66c3907
feat: add QueryContext class for handling query data
elyosemite Nov 26, 2025
5c824f5
feat: add CommandContext class for encapsulating command data
elyosemite Nov 26, 2025
2759ae3
feat: define IHandlerHandle and IDynamicHandler interfaces for messag…
elyosemite Nov 26, 2025
417dd55
feat: add EventContext class for encapsulating event data
elyosemite Nov 26, 2025
06ecf68
feat: add IConsumerConnector interface for connecting message handlers
elyosemite Nov 26, 2025
2af1de5
feat: add IConsumerRegister interface for registering command, query,…
elyosemite Nov 26, 2025
e0404af
feat: add IMediator interface for handling message sending and publis…
elyosemite Nov 26, 2025
c091e6e
feat: implement UltraMediator class for handling commands, queries, a…
elyosemite Nov 26, 2025
d6f6d18
Merge pull request #5 from elyosemite/feat/init
elyosemite Nov 26, 2025
a9b0943
feat: remove obsolete context and mediator classes and interfaces
elyosemite Nov 26, 2025
9fd8585
feat: add command, query, and event context classes and mediator inte…
elyosemite Nov 26, 2025
e46db99
feat: add initial implementation of UltraSpeedBus with command, query…
elyosemite Nov 26, 2025
c7f0d69
feat: add documentation for UltraSpeedBus.Extensions.DependencyInject…
elyosemite Nov 26, 2025
f4d84e2
feat: update README with command handler example and package installa…
elyosemite Nov 26, 2025
b41b00e
feat: add command and query handler examples to README
elyosemite Nov 26, 2025
3013efe
Merge pull request #6 from elyosemite/feat/init
elyosemite Nov 26, 2025
9aafbf9
feat: add package metadata for UltraSpeedBus.Extensions.DependencyInj…
elyosemite Nov 26, 2025
dd06982
Merge pull request #7 from elyosemite/feat/init
elyosemite Nov 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
"name": ".NET Core Launch (web)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/sample/UltraSpeedBus.WebAPI/bin/Debug/net8.0/UltraSpeedBus.WebAPI.dll",
"args": [],
"cwd": "${workspaceFolder}/sample/UltraSpeedBus.WebAPI",
"stopAtEntry": false,
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/Views"
}
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
53 changes: 53 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/sample/UltraSpeedBus.WebAPI/UltraSpeedBus.WebAPI.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "build2",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/UltraSpeedBus.Abstractions/UltraSpeedBus.Abstractions.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"promptOnClose": false
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/sample/UltraSpeedBus.WebAPI/UltraSpeedBus.WebAPI.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/sample/UltraSpeedBus.WebAPI/UltraSpeedBus.WebAPI.csproj"
],
"problemMatcher": "$msCompile"
}
]
}
55 changes: 50 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ UltraSpeedBus is a free, open-source messaging framework for .NET, engineered fo
| ---------------------------- | --------------------------------------------------------------------------------------------- |
| `UltraSpeedBus` | The core library with message transport, context, pipelines, and integration implementations. |
| `UltraSpeedBus.Abstractions` | Contains the core contracts, interfaces, and message envelope definitions for the system. |
| `UltraSpeedBus.Extensions.DependencyInjection` | Inject your dependencies |

## Features

Expand All @@ -23,18 +24,62 @@ UltraSpeedBus is a free, open-source messaging framework for .NET, engineered fo
# Install the packages via NuGet
dotnet add package UltraSpeedBus
dotnet add package UltraSpeedBus.Abstractions
dotnet add package UltraSpeedBus.Extensions.DependencyInjection
```

## Command handler

```csharp
using UltraSpeedBus;
using UltraSpeedBus.Abstractions;

// Create a message
var message = new MyCommand { Name = "Test" };
var envelope = MessageFactory.Create(message);
// Create a command and command Handler with ICommandHandler
public sealed record CreateOrderCommand(string Product, int Quantity);
public sealed record OrderResult(int OrderId);

public class CreateOrderHandler : ICommandHandler<CreateOrderCommand, OrderResult>
{
public Task<OrderResult> Handle(CommandContext<CreateOrderCommand> request)
{
int generatedId = Random.Shared.Next(1000, 9999);
return Task.FromResult(new OrderResult(generatedId));
}
}
```

## Query Handler

```cs
public sealed record GetOrderQuery(int OrderId);
public sealed record OrderDto(int OrderId, string Description);

public class GetOrderQueryHandler : IQueryHandler<GetOrderQuery, OrderDto?>
{
public Task<OrderDto?> Handle(QueryContext<GetOrderQuery> context)
{
if (context.Query.OrderId == 42)
{
return Task.FromResult<OrderDto?>(new OrderDto(42, "Example Order"));
}

return Task.FromResult<OrderDto?>(null);
}
}
```

## Event Handler

```cs
public sealed record OrderCreatedEvent(int OrderId);

// Send using your transport implementation (e.g., Azure Service Bus)
await producer.SendAsync(envelope);
public class OrderCreatedEventHandler : IEventHandler<OrderCreatedEvent>
{
public Task Handle(EventContext<OrderCreatedEvent> context)
{
Console.WriteLine($"[Event] Order created → Id = {context.Event.OrderId}");
return Task.CompletedTask;
}
}
```

## Contributing
Expand Down
6 changes: 0 additions & 6 deletions UltraSpeedBus.Abstractions/Message/ICommand.cs

This file was deleted.

7 changes: 0 additions & 7 deletions UltraSpeedBus.Abstractions/Message/ICommandHandler.cs

This file was deleted.

6 changes: 0 additions & 6 deletions UltraSpeedBus.Abstractions/Message/IEvent.cs

This file was deleted.

7 changes: 0 additions & 7 deletions UltraSpeedBus.Abstractions/Message/IEventHandler.cs

This file was deleted.

14 changes: 0 additions & 14 deletions UltraSpeedBus.Abstractions/Message/IMessage.cs

This file was deleted.

3 changes: 0 additions & 3 deletions UltraSpeedBus.Abstractions/Message/IQuery.cs

This file was deleted.

7 changes: 0 additions & 7 deletions UltraSpeedBus.Abstractions/Message/IQueryHandler.cs

This file was deleted.

7 changes: 0 additions & 7 deletions UltraSpeedBus.Abstractions/Transport/ITransport.cs

This file was deleted.

23 changes: 0 additions & 23 deletions UltraSpeedBus.Abstractions/Transport/ITransportConsumer.cs

This file was deleted.

20 changes: 0 additions & 20 deletions UltraSpeedBus.Abstractions/Transport/ITransportProducer.cs

This file was deleted.

10 changes: 7 additions & 3 deletions UltraSpeedBus.slnx
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
<Solution>
<Folder Name="/sample/">
<Project Path="sample/UltraSpeedBus.WebAPI/UltraSpeedBus.WebAPI.csproj" />
</Folder>
<Folder Name="/src/">
<Project Path="UltraSpeedBus.Abstractions/UltraSpeedBus.Abstractions.csproj" />
<Project Path="UltraSpeedBus.Tests/UltraSpeedBus.Tests.csproj" />
<Project Path="UltraSpeedBus/UltraSpeedBus.csproj" />
<Project Path="src/UltraSpeedBus.Abstractions/UltraSpeedBus.Abstractions.csproj" />
<Project Path="src/UltraSpeedBus.Tests/UltraSpeedBus.Tests.csproj" />
<Project Path="src/UltraSpeedBus/UltraSpeedBus.csproj" />
<Project Path="src/UltraSpeedBus.Extensions.DepedencyInjection/UltraSpeedBus.Extensions.DepedencyInjection.csproj" />
</Folder>
</Solution>
51 changes: 51 additions & 0 deletions sample/UltraSpeedBus.WebAPI/CreateOrderHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using UltraSpeedBus.Abstractions;
using UltraSpeedBus.Abstractions.Contracts;


namespace UltraSpeedBus.WebAPI;


#region Command
public sealed record CreateOrder(string Product, int Quantity);
public sealed record OrderResult(int OrderId);
public sealed record OrderCreated(int OrderId);

public class CreateOrderHandler : ICommandHandler<CreateOrder, OrderResult>
{
public Task<OrderResult> Handle(CommandContext<CreateOrder> request)
{
// Simula criação de pedido
int generatedId = Random.Shared.Next(1000, 9999);

return Task.FromResult(new OrderResult(generatedId));
}
}
#endregion

#region Query
public sealed record GetOrder(int OrderId);
public sealed record OrderDto(int OrderId, string Description);
public class GetOrderQueryHandler : IQueryHandler<GetOrder, OrderDto?>
{
public Task<OrderDto?> Handle(QueryContext<GetOrder> context)
{
if (context.Query.OrderId == 42)
{
return Task.FromResult<OrderDto?>(new OrderDto(42, "Example Order"));
}

return Task.FromResult<OrderDto?>(null);
}
}
#endregion

#region Event
public class OrderCreatedEventHandler : IEventHandler<OrderCreated>
{
public Task Handle(EventContext<OrderCreated> context)
{
Console.WriteLine($"[Event] Order created → Id = {context.Event.OrderId}");
return Task.CompletedTask;
}
}
#endregion
Loading