Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
12e568e
initial aspire
quezlatch Jun 19, 2026
fb3c88a
test: add Eventuous.Tests.Azure.Storage.Blobs project with tests for …
quezlatch Jun 19, 2026
ceab0b4
refactor: extract duplication from StorageBlobsProjectorTests and sur…
quezlatch Jun 19, 2026
b154f98
feat: add constructor overload to StorageBlobsProjector that takes Bl…
quezlatch Jun 19, 2026
fa5ded0
fix tests
quezlatch Jun 19, 2026
6251ad9
make context typed in On methods
quezlatch Jun 19, 2026
7dc10ad
update azure sample to use blob storage
quezlatch Jun 19, 2026
e47c589
update aspire sql databases
quezlatch Jun 19, 2026
5f07032
add race condition check
quezlatch Jun 20, 2026
ad263da
refactor
quezlatch Jun 21, 2026
4872b2d
add projector options
quezlatch Jun 21, 2026
b70b26e
enhance blob name resolution in projection
quezlatch Jun 21, 2026
b09e9f0
adjust blob name generation
quezlatch Jun 21, 2026
83664b4
refactor
quezlatch Jun 22, 2026
2b6cdad
add xml docs
quezlatch Jun 22, 2026
86c9933
documentation
quezlatch Jun 22, 2026
ff371ba
add scalar as swagger/openapi client
quezlatch Jun 25, 2026
b0812fa
refactor
quezlatch Jun 25, 2026
5fbaf53
retries on race conditions
quezlatch Jun 25, 2026
3b1fbcb
tidy
quezlatch Jun 25, 2026
eae7f04
oops
quezlatch Jun 25, 2026
4022b4d
review feedback
quezlatch Jun 25, 2026
8471b94
add .NoContext()
quezlatch Jun 25, 2026
f21f2df
correct aspire http endpoints
quezlatch Jun 26, 2026
d5142c6
remove azure sample
quezlatch Jul 1, 2026
88b47c8
add idempotency functionality
quezlatch Jul 1, 2026
c07f9d5
refactor tests
quezlatch Jul 1, 2026
5406f30
update readme
quezlatch Jul 1, 2026
bafa903
Merge branch 'dev' into aspire-and-blob-storage
quezlatch Jul 1, 2026
4fe57c2
tidy
quezlatch Jul 1, 2026
f0c9a4a
tidy
quezlatch Jul 1, 2026
70cfd2d
update readme
quezlatch Jul 2, 2026
aa05e06
make options non-generic by removing serialisation overrides
quezlatch Jul 2, 2026
4e0e2ee
initial aspire
quezlatch Jul 4, 2026
e0bcf76
enable openapi through scalar
quezlatch Jul 4, 2026
1add1d3
correctly configure noda time
quezlatch Jul 4, 2026
44c83f5
add readme
quezlatch Jul 4, 2026
bed911b
add structured logs to aspire dashboard
quezlatch Jul 4, 2026
4d90e23
correctly pass through json options from DI
quezlatch Jul 4, 2026
5bc95ad
do not use IOptions wrapper
quezlatch Jul 4, 2026
c2bbabd
Merge branch 'aspire-and-blob-storage' into aspire-only
quezlatch Jul 4, 2026
71a6bf0
rename files
quezlatch Jul 6, 2026
998b297
Merge branch 'aspire-and-blob-storage' into aspire-only
quezlatch Jul 8, 2026
08ab02b
Merge branch 'dev' into aspire-and-blob-storage
quezlatch Jul 16, 2026
001b75d
Merge branch 'aspire-and-blob-storage' into aspire-only
quezlatch Jul 16, 2026
6420e1a
fix rename
quezlatch Jul 16, 2026
3341b1d
add nocontext
quezlatch Jul 16, 2026
260c2d4
align otel package versions
quezlatch Jul 16, 2026
129eace
tidy azure client initialisation
quezlatch Jul 16, 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
30 changes: 22 additions & 8 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,24 @@
<PropertyGroup Label="Testcontainers version">
<TestcontainersVersion>4.10.0</TestcontainersVersion>
</PropertyGroup>
<PropertyGroup Label="Aspire SDK version">
<AspireSdkVersion>13.4.6</AspireSdkVersion>
</PropertyGroup>
<PropertyGroup>
<NpgsqlVersion>10.0.1</NpgsqlVersion>
<TUnitVersion>0.77.3</TUnitVersion>
<OtelInstrumentationVersion>1.16.0</OtelInstrumentationVersion>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Aspire.Hosting.Azure.ServiceBus" Version="$(AspireSdkVersion)" />
<PackageVersion Include="Aspire.Hosting.Azure.Sql" Version="$(AspireSdkVersion)" />
<PackageVersion Include="Aspire.Hosting.Azure.Storage" Version="$(AspireSdkVersion)" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.29.0" />
<PackageVersion Include="BenchmarkDotNet" Version="0.14.0" />
<PackageVersion Include="FluentValidation" Version="12.0.0" />
<PackageVersion Include="IsExternalInit" Version="1.0.3" />
<PackageVersion Include="KurrentDB.Client" Version="1.3.0" />
<PackageVersion Include="Microsoft.Extensions.Azure" Version="1.14.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="$(MicrosoftExtensionsVer)" />
Expand All @@ -37,12 +46,13 @@
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageVersion Include="Scalar.Aspire" Version="0.11.0" />
<PackageVersion Include="Shouldly" Version="4.2.1" />
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="System.Linq.AsyncEnumerable" Version="10.0.0" />
<PackageVersion Include="System.Reactive" Version="6.0.1" />
<PackageVersion Include="OpenTelemetry.Api" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Api" Version="$(OtelInstrumentationVersion)" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="$(OtelInstrumentationVersion)" />
<PackageVersion Include="MongoDB.Driver" Version="3.4.0" />
<PackageVersion Include="Google.Cloud.PubSub.V1" Version="3.19.0" />
<PackageVersion Include="Confluent.Kafka" Version="2.6.1" />
Expand All @@ -62,6 +72,7 @@
</ItemGroup>
<ItemGroup Label="Testcontainers">
<PackageVersion Include="Testcontainers" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.Azurite" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.KurrentDb" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.Kafka" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.MongoDb" Version="$(TestcontainersVersion)" />
Expand Down Expand Up @@ -106,16 +117,19 @@
<PackageVersion Include="MongoDB.Driver.Core.Extensions.DiagnosticSources" Version="2.1.0" />
<PackageVersion Include="MongoDB.Driver.Core" Version="2.30.0" />
<PackageVersion Include="Npgsql.OpenTelemetry" Version="$(NpgsqlVersion)" />
<PackageVersion Include="OpenTelemetry" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.15.3-beta.1" />
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.15.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.15.1-beta.1" />
<PackageVersion Include="OpenTelemetry" Version="$(OtelInstrumentationVersion)" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="$(OtelInstrumentationVersion)" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.16.0-beta.1" />
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="$(OtelInstrumentationVersion)" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="$(OtelInstrumentationVersion)" />
<PackageVersion Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.16.0-beta.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.SqlClient" Version="$(OtelInstrumentationVersion)" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="$(OtelInstrumentationVersion)" />
Comment thread
quezlatch marked this conversation as resolved.
<PackageVersion Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.Seq" Version="9.0.0" />
<PackageVersion Include="Serilog.Sinks.OpenTelemetry" Version="4.2.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="9.0.1" />
</ItemGroup>
</Project>
8 changes: 8 additions & 0 deletions Eventuous.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
<Folder Name="/Brokers/Azure/" />
<Folder Name="/Brokers/Azure/src/">
<Project Path="src/Azure/src/Eventuous.Azure.ServiceBus/Eventuous.Azure.ServiceBus.csproj" />
<Project Path="src/Azure/src/Eventuous.Azure.Storage.Blobs/Eventuous.Azure.Storage.Blobs.csproj" />
</Folder>
<Folder Name="/Brokers/Azure/test/">
<Project Path="src/Azure/test/Eventuous.Tests.Azure.ServiceBus/Eventuous.Tests.Azure.ServiceBus.csproj" />
<Project Path="src/Azure/test/Eventuous.Tests.Azure.Storage.Blobs/Eventuous.Tests.Azure.Storage.Blobs.csproj" />
</Folder>
<Folder Name="/Brokers/GooglePubSub/" />
<Folder Name="/Brokers/GooglePubSub/src/">
Expand Down Expand Up @@ -162,6 +164,12 @@
<Project Path="samples/postgres/Bookings.Payments/Bookings.Payments.csproj" />
<Project Path="samples/postgres/Bookings/Bookings.csproj" />
</Folder>
<Folder Name="/Samples/Azure/">
<Project Path="samples/azure/Bookings.AppHost/Bookings.AppHost.csproj" />
<Project Path="samples/azure/Bookings.Domain/Bookings.Domain.csproj" />
<Project Path="samples/azure/Bookings.Payments/Bookings.Payments.csproj" />
<Project Path="samples/azure/Bookings/Bookings.csproj" />
</Folder>
<Folder Name="/SignalR/" />
<Folder Name="/SignalR/src/">
<Project Path="src/SignalR/src/Eventuous.SignalR.Server/Eventuous.SignalR.Server.csproj" />
Expand Down
12 changes: 12 additions & 0 deletions nuget.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="https://api.nuget.org/v3/index.json" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="https://api.nuget.org/v3/index.json">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
41 changes: 41 additions & 0 deletions samples/azure/Bookings.AppHost/AppHost.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using Scalar.Aspire;

var builder = DistributedApplication.CreateBuilder(args);

var sql = builder.AddAzureSqlServer("sql").RunAsContainer();
var bookingsDb = sql.AddDatabase("bookings-db");
var paymentsDb = sql.AddDatabase("payments-db");

var serviceBus = builder.AddAzureServiceBus("sbemulators").RunAsEmulator();
var queue = serviceBus.AddServiceBusQueue("PaymentsIntegration");

var blobs = builder.AddAzureStorage("storage").RunAsEmulator().AddBlobs("blobs");
var containers = blobs.AddBlobContainer("bookings-container");

var bookings = builder.AddProject<Projects.Bookings>("bookings")
.WithHttpEndpoint()
.WithHttpHealthCheck("/health")
.WithReference(bookingsDb)
.WithReference(serviceBus)
.WithReference(blobs)
.WaitFor(bookingsDb)
.WaitFor(serviceBus)
.WaitFor(blobs);

var payments = builder.AddProject<Projects.Bookings_Payments>("payments")
.WithHttpEndpoint()
.WithHttpHealthCheck("/health")
.WithReference(paymentsDb)
.WithReference(serviceBus)
.WithReference(blobs)
.WaitFor(paymentsDb)
.WaitFor(serviceBus)
.WaitFor(blobs);

var scalar = builder.AddScalarApiReference()
.WithApiReference(bookings)
.WithApiReference(payments)
.WaitFor(bookings)
.WaitFor(payments);

builder.Build().Run();
25 changes: 25 additions & 0 deletions samples/azure/Bookings.AppHost/Bookings.AppHost.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<Project Sdk="Aspire.AppHost.Sdk/13.4.6">
Comment thread
qodo-free-for-open-source-projects[bot] marked this conversation as resolved.

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UserSecretsId>301020ec-674b-4bcd-ba8f-2eddd4c017df</UserSecretsId>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Bookings\Bookings.csproj" />
<ProjectReference Include="..\Bookings.Payments\Bookings.Payments.csproj" />
</ItemGroup>

<ItemGroup>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Aspire.Hosting.Azure.ServiceBus" />
<PackageReference Include="Aspire.Hosting.Azure.Sql" />
<PackageReference Include="Aspire.Hosting.Azure.Storage" />
<PackageReference Include="Scalar.Aspire" />
</ItemGroup>
</Project>
8 changes: 8 additions & 0 deletions samples/azure/Bookings.AppHost/appsettings.Development.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
9 changes: 9 additions & 0 deletions samples/azure/Bookings.AppHost/appsettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Aspire.Hosting.Dcp": "Warning"
}
}
}
16 changes: 16 additions & 0 deletions samples/azure/Bookings.Domain/Bookings.Domain.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Configurations>Debug;Release</Configurations>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NodaTime"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(CoreRoot)\Eventuous.Domain\Eventuous.Domain.csproj" />
<ProjectReference Include="$(CoreRoot)\Eventuous.Shared\Eventuous.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\kurrentdb\Bookings.Domain\*.cs" />
<Compile Include="..\..\kurrentdb\Bookings.Domain\Bookings\*.cs" LinkBase="Bookings" />
</ItemGroup>
</Project>
47 changes: 47 additions & 0 deletions samples/azure/Bookings.Payments/Bookings.Payments.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<Configurations>Debug;Release</Configurations>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Azure.Storage.Blobs" />
<PackageReference Include="Microsoft.Extensions.Azure" />
<PackageReference Include="NodaTime.Serialization.SystemTextJson"/>
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" />
<PackageReference Include="OpenTelemetry.Exporter.Zipkin" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.SqlClient" />
<PackageReference Include="Serilog.Extensions.Hosting" />
<PackageReference Include="Serilog.Sinks.Console" />
<PackageReference Include="Serilog.Sinks.OpenTelemetry" />
<PackageReference Include="Swashbuckle.AspNetCore" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\Bookings\Infrastructure\Logging.cs">
<Link>Infrastructure\Logging.cs</Link>
</Compile>
<Compile Include="..\Bookings\Infrastructure\Telemetry.cs">
<Link>Infrastructure\Telemetry.cs</Link>
</Compile>
<Compile Include="..\..\kurrentdb\Bookings.Payments\Domain\*.cs">
<Link>Domain\%(Filename)%(Extension)</Link>
</Compile>
<Compile Include="..\..\kurrentdb\Bookings.Payments\Application\*.cs">
<Link>Application\%(Filename)%(Extension)</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(SrcRoot)\Extensions\src\Eventuous.Extensions.AspNetCore\Eventuous.Extensions.AspNetCore.csproj"/>
<ProjectReference Include="$(SrcRoot)\Extensions\src\Eventuous.Extensions.DependencyInjection\Eventuous.Extensions.DependencyInjection.csproj"/>
<ProjectReference Include="$(SrcRoot)\Diagnostics\src\Eventuous.Diagnostics.OpenTelemetry\Eventuous.Diagnostics.OpenTelemetry.csproj"/>
<ProjectReference Include="$(SrcRoot)\Gateway\src\Eventuous.Gateway\Eventuous.Gateway.csproj"/>
<ProjectReference Include="$(SrcRoot)\Core\gen\Eventuous.Subscriptions.Generators\Eventuous.Subscriptions.Generators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="$(SrcRoot)\Core\gen\Eventuous.Shared.Generators\Eventuous.Shared.Generators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="$(SrcRoot)\Experimental\src\Eventuous.Spyglass\Eventuous.Spyglass.csproj"/>
<ProjectReference Include="$(SrcRoot)\Experimental\gen\Eventuous.Spyglass.Generators\Eventuous.Spyglass.Generators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="$(SrcRoot)\SqlServer\src\Eventuous.SqlServer\Eventuous.SqlServer.csproj" />
<ProjectReference Include="$(SrcRoot)\Azure\src\Eventuous.Azure.ServiceBus\Eventuous.Azure.ServiceBus.csproj" />
</ItemGroup>
</Project>
31 changes: 31 additions & 0 deletions samples/azure/Bookings.Payments/Integration/Payments.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Bookings.Payments.Domain;
using Eventuous;
using Eventuous.Azure.ServiceBus.Producers;
using Eventuous.Gateway;
using Eventuous.Subscriptions.Context;
using static Bookings.Payments.Integration.IntegrationEvents;

namespace Bookings.Payments.Integration;

public static class PaymentsGateway {
static readonly StreamName Stream = new("PaymentsIntegration");
static readonly ServiceBusProduceOptions ProduceOptions = new();

public static ValueTask<GatewayMessage<ServiceBusProduceOptions>[]> Transform(IMessageConsumeContext original) {
var result = original.Message is PaymentEvents.PaymentRecorded evt
? new GatewayMessage<ServiceBusProduceOptions>(
Stream,
new BookingPaymentRecorded(original.Stream.GetId(), evt.BookingId, evt.Amount, evt.Currency),
new(),
ProduceOptions
)
: null;

return ValueTask.FromResult<GatewayMessage<ServiceBusProduceOptions>[]>(result != null ? [result] : []);
}
}

public static class IntegrationEvents {
[EventType("BookingPaymentRecorded")]
public record BookingPaymentRecorded(string PaymentId, string BookingId, float Amount, string Currency);
}
43 changes: 43 additions & 0 deletions samples/azure/Bookings.Payments/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using Bookings.Infrastructure;
using Bookings.Payments;
using Bookings.Payments.Domain;
using Eventuous;
using Microsoft.OpenApi.Models;
using NodaTime;
using NodaTime.Serialization.SystemTextJson;
using Serilog;
using static Bookings.Payments.Application.PaymentCommands;

TypeMap.RegisterKnownEventTypes();
Logging.ConfigureLog();

var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog();

builder.Services.AddEndpointsApiExplorer();
builder.Services
.AddControllers()
.AddJsonOptions(cfg => cfg.JsonSerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb));
builder.Services.ConfigureHttpJsonOptions(cfg => cfg.SerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb));
builder.Services.AddSwaggerGen(c => {
c.SwaggerDoc("v1", new() { Title = "Bookings API", Version = "v1" });
c.AddServer(new OpenApiServer { Url = "/" }); // Relative path
});
// OpenTelemetry instrumentation must be added before adding Eventuous services
builder.Services.AddTelemetry();
builder.Services.AddEventuous(builder.Configuration);

builder.Services.AddHealthChecks();

var app = builder.Build();

app.Services.AddEventuousLogs();
app.UseSwagger(c=>c.RouteTemplate = "openapi/{documentName}.json");
app.UseOpenTelemetryPrometheusScrapingEndpoint();

app.MapHealthChecks("/health");

// Here we discover commands by their annotations
app.MapCommands<PaymentState>().MapCommand<RecordPayment>();

app.Run();
37 changes: 37 additions & 0 deletions samples/azure/Bookings.Payments/Registrations.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using Bookings.Payments.Application;
using Bookings.Payments.Domain;
using Bookings.Payments.Integration;
using Eventuous.Azure.ServiceBus.Producers;
using Eventuous.SqlServer;
using Eventuous.SqlServer.Subscriptions;
using Microsoft.Extensions.Azure;

namespace Bookings.Payments;

public static class Registrations {
public static void AddEventuous(this IServiceCollection services, IConfiguration configuration) {
services.AddAzureClients(builder => {
var sbConnectionString = configuration.GetConnectionString("sbemulators") ?? throw new InvalidOperationException("Connection string 'sbemulators' not found.");
builder.AddServiceBusClient(sbConnectionString);
var blobConnectionString = configuration.GetConnectionString("blobs") ?? throw new InvalidOperationException("Connection string 'blobs' not found.");
builder.AddBlobServiceClient(blobConnectionString);
});

var connectionString = configuration.GetConnectionString("payments-db") ?? throw new InvalidOperationException("Connection string 'payments-db' not found.");

services.AddEventuousSqlServer(connectionString, initializeDatabase: true);
services.AddEventStore<SqlServerStore>();
services.AddSqlServerCheckpointStore();
services.AddCommandService<CommandService, PaymentState>();
services.AddProducer<ServiceBusProducer>();
services.AddSingleton(new ServiceBusProducerOptions {
QueueOrTopicName = "PaymentsIntegration",
});

services
.AddGateway<SqlServerAllStreamSubscription, SqlServerAllStreamSubscriptionOptions, ServiceBusProducer, ServiceBusProduceOptions>(
"IntegrationSubscription",
PaymentsGateway.Transform
);
}
}
14 changes: 14 additions & 0 deletions samples/azure/Bookings.Payments/appsettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"ConnectionStrings": {
"database": "from aspire",
"sbemulators": "from aspire",
"blobs": "from aspire"
},
"Logging": {
"LogLevel": {
"Default": "Debug",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Loading
Loading