Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
173b930
Experimenting with queue support
ejsmith Mar 26, 2026
d12ab4c
Update queue implementation using new features
ejsmith Mar 29, 2026
33c6820
Lots of distributed progress
ejsmith Apr 4, 2026
bb048a8
Revert performance.md and benchmark CSV to main
ejsmith Apr 4, 2026
b3a42fb
Rename ClientEventStreamHandler.cs to EventHandler.cs to match class …
ejsmith Apr 4, 2026
f2075e3
Apply code review fixes for distributed abstractions
ejsmith Apr 4, 2026
0d9f3ad
Merge remote-tracking branch 'origin/main' into queues
ejsmith Apr 5, 2026
a8d0bd8
More progress
ejsmith Apr 5, 2026
8018914
Add Redis store tests
ejsmith Apr 5, 2026
e582736
More progress
ejsmith Apr 5, 2026
e98f8db
More progress
ejsmith Apr 7, 2026
a25913d
Add integration test for Result.Accepted with Location header
ejsmith Apr 7, 2026
f6c2df3
Revert "Add integration test for Result.Accepted with Location header"
ejsmith Apr 7, 2026
a926509
fix: pin LocalStack to 3.8.1 to avoid license requirement
ejsmith Apr 7, 2026
682dbaa
fix: increase AbandonAsync_WithDelay test timeouts for CI
ejsmith Apr 7, 2026
a3d5bcd
fix: address CodeQL review comments (unused vars, redundant null checks)
ejsmith Apr 7, 2026
02c95c9
Merge remote-tracking branch 'origin/main' into queues
ejsmith Apr 7, 2026
7333b26
Add notification selection. Add docs
ejsmith Apr 7, 2026
0ee830e
Tweaks
ejsmith Apr 7, 2026
3f265f7
Remove doc link
ejsmith Apr 7, 2026
867cb17
Another tweak
ejsmith Apr 7, 2026
a5194fd
Cleanup
ejsmith Apr 8, 2026
846d483
Updates
ejsmith Apr 8, 2026
75387aa
More updates
ejsmith Apr 8, 2026
c9260e6
Update sample readme
ejsmith Apr 8, 2026
47eb6bc
Cleanup telemetry
ejsmith Apr 8, 2026
0760ba2
Manual distributed version for now
ejsmith Apr 9, 2026
b6015c2
Progress and updates
ejsmith Apr 9, 2026
fa998b4
Address PR review feedback from code quality analysis
niemyjski Apr 10, 2026
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
46 changes: 27 additions & 19 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Clean Architecture Sample",
"type": "dotnet",
"request": "launch",
"projectPath": "${workspaceFolder}/samples/CleanArchitectureSample/src/Api/Api.csproj"
},
{
"name": "Console Sample",
"type": "dotnet",
"request": "launch",
"projectPath": "${workspaceFolder}/samples/ConsoleSample/ConsoleSample.csproj"
}
]
}
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "aspire",
"request": "launch",
"name": "Clean Architecture Sample",
"program": "${workspaceFolder}/samples/CleanArchitectureSample/src/AppHost/AppHost.csproj",
"debuggers2": {
"project": {
"console": "integratedTerminal",
"logging": {
"moduleLoad": false
}
}
}
},
{
"name": "Console Sample",
"type": "dotnet",
"request": "launch",
"projectPath": "${workspaceFolder}/samples/ConsoleSample/ConsoleSample.csproj"
}
]
}
9 changes: 9 additions & 0 deletions Foundatio.Mediator.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
<Project Path="samples/CleanArchitectureSample/src/Products.Module/Products.Module.csproj" />
<Project Path="samples/CleanArchitectureSample/src/Reports.Module/Reports.Module.csproj" />
<Project Path="samples/CleanArchitectureSample/src/Web/Web.esproj" />
<Project Path="samples/CleanArchitectureSample/src/ServiceDefaults/ServiceDefaults.csproj" />
<Project Path="samples/CleanArchitectureSample/src/AppHost/AppHost.csproj" />
</Folder>
<Folder Name="/Solution Items/">
<File Path=".github/copilot-instructions.md" />
Expand All @@ -21,8 +23,15 @@
<Folder Name="/src/">
<Project Path="src/Foundatio.Mediator.Abstractions/Foundatio.Mediator.Abstractions.csproj" />
<Project Path="src/Foundatio.Mediator/Foundatio.Mediator.csproj" />
<Project Path="src/Foundatio.Mediator.Distributed/Foundatio.Mediator.Distributed.csproj" />
<Project Path="src/Foundatio.Mediator.Distributed.Aws/Foundatio.Mediator.Distributed.Aws.csproj" />
<Project Path="src/Foundatio.Mediator.Distributed.Redis/Foundatio.Mediator.Distributed.Redis.csproj" />
</Folder>
<Folder Name="/tests/">
<Project Path="tests/Foundatio.Mediator.Tests/Foundatio.Mediator.Tests.csproj" />
<Project Path="tests/Foundatio.Mediator.Distributed.Tests/Foundatio.Mediator.Distributed.Tests.csproj" />
<Project Path="tests/Foundatio.Mediator.Distributed.Aws.Tests/Foundatio.Mediator.Distributed.Aws.Tests.csproj" />
<Project Path="tests/Foundatio.Mediator.Distributed.Redis.Tests/Foundatio.Mediator.Distributed.Redis.Tests.csproj" />

</Folder>
</Solution>
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,32 @@ GET /api/todos/{id} → 200 OK / 404 Not Found

Routes, HTTP methods, parameter binding, and OpenAPI metadata are all inferred from your message names and `Result` factory calls.

### Go distributed

Ready to scale out? Add `[Queue]` to any handler — same code, now processed asynchronously via a background queue:

```csharp
public record SendEmail(string To, string Subject, string Body);

[Queue]
public class SendEmailHandler(IEmailService email)
{
public async Task HandleAsync(SendEmail msg, CancellationToken ct)
=> await email.SendAsync(msg.To, msg.Subject, msg.Body, ct);
}
```

The message is queued and processed asynchronously by a background worker. Full retry, dead-lettering, and progress tracking built in.

Broadcast events across all nodes in your cluster with a marker interface:

```csharp
public record ProductPriceChanged(string ProductId, decimal NewPrice) : IDistributedNotification;
```

Your handlers, middleware, DI, and error handling all work exactly the same — the distributed layer just changes _where_ execution happens. Pluggable transports for AWS SQS/SNS, with more coming soon.


**👉 [Getting Started Guide](https://mediator.foundatio.dev/guide/getting-started.html)** — step-by-step setup with code samples for ASP.NET Core and console apps.

**📖 [Complete Documentation](https://mediator.foundatio.dev)**
Expand Down
5 changes: 5 additions & 0 deletions aspire.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"appHost": {
"path": "samples/CleanArchitectureSample/src/AppHost/AppHost.csproj"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
<PackageReference Include="Immediate.Handlers" Version="3.3.0" />
<PackageReference Include="MassTransit" Version="9.0.1" />
<PackageReference Include="Immediate.Handlers" Version="3.4.0" />
<PackageReference Include="MassTransit" Version="9.1.0" />
<PackageReference Include="MediatR" Version="14.1.0" />
<PackageReference Include="RhoMicro.BdnLogging" Version="1.0.3" />
<PackageReference Include="WolverineFx" Version="5.27.0" />
<PackageReference Include="Scriban" Version="7.0.3" /> <!-- Override transitive Scriban to fix NU1902/NU1903 vulnerabilities -->
<PackageReference Include="WolverineFx" Version="5.29.0" />
<PackageReference Include="Scriban" Version="7.1.0" /> <!-- Override transitive Scriban to fix NU1902/NU1903 vulnerabilities -->
<PackageReference Include="Mediator.Abstractions" Version="3.0.2" />
<PackageReference Include="Mediator.SourceGenerator" Version="3.0.2" PrivateAssets="All" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="10.0.5" />
Expand Down
1 change: 1 addition & 0 deletions build/common.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<PackageReleaseNotes>https://github.com/FoundatioFx/Foundatio.Mediator/releases</PackageReleaseNotes>
<PackageTags>Foundatio;Mediator;CQRS;Messaging;SourceGenerator;Interceptors</PackageTags>
<MinVerSkip Condition="'$(Configuration)' == 'Debug'">true</MinVerSkip>
<MinVerDefaultPreReleaseIdentifiers>beta.0</MinVerDefaultPreReleaseIdentifiers>
<MinVerTagPrefix>v</MinVerTagPrefix>

<Copyright>Copyright © $([System.DateTime]::Now.ToString(yyyy)) Foundatio. All rights reserved.</Copyright>
Expand Down
10 changes: 10 additions & 0 deletions build/distributed.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project>

<!-- Distributed packages are versioned separately. Bump here when releasing. -->
<PropertyGroup>
<MinVerSkip>true</MinVerSkip>
<Version>0.1.0-beta1</Version>
<PackageTags>$(PackageTags);Distributed</PackageTags>
</PropertyGroup>

</Project>
9 changes: 9 additions & 0 deletions docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,15 @@ export default withMermaid(defineConfig({
{ text: 'Testing', link: '/guide/testing' }
]
},
{
text: 'Distributed',
items: [
{ text: 'Going Distributed', link: '/guide/distributed-overview' },
{ text: 'Distributed Queues', link: '/guide/distributed-queues' },
{ text: 'Distributed Notifications', link: '/guide/distributed-notifications' },
{ text: 'Transport Providers', link: '/guide/distributed-transports' }
]
},
{
text: 'Advanced Topics',
items: [
Expand Down
Loading
Loading