Skip to content

Commit

Permalink
Simplify command services (#350)
Browse files Browse the repository at this point in the history
* Simplified command services
* Removed stateless aggregate
* New sample with custom result for HTTP API (controller)
* Added a read model query to one sample
  • Loading branch information
alexeyzimarev authored Jun 20, 2024
1 parent 0356301 commit 58b05ff
Show file tree
Hide file tree
Showing 215 changed files with 1,447 additions and 2,309 deletions.
202 changes: 102 additions & 100 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -1,102 +1,104 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<PropertyGroup Label="Microsoft extensions">
<MicrosoftExtensionsVer>8.0</MicrosoftExtensionsVer>
<MicrosoftHealthCheckVer>8.0.6</MicrosoftHealthCheckVer>
</PropertyGroup>
<PropertyGroup Label="Package versions for .NET 6" Condition="'$(TargetFramework)' == 'net6.0'">
<MicrosoftTestHostVer>[6.0.5,7)</MicrosoftTestHostVer>
<DiffPlexVersion>2.3.0</DiffPlexVersion>
</PropertyGroup>
<PropertyGroup Label="Package versions for .NET 8" Condition="'$(TargetFramework)' == 'net8.0'">
<MicrosoftTestHostVer>8.0.6</MicrosoftTestHostVer>
<DiffPlexVersion>3.0.0</DiffPlexVersion>
</PropertyGroup>
<PropertyGroup Label="Testcontainers version">
<TestcontainersVersion>3.9.0</TestcontainersVersion>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="BenchmarkDotNet" Version="0.13.12"/>
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="$(MicrosoftHealthCheckVer)"/>
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftExtensionsVer)"/>
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="8.0.1"/>
<PackageVersion Include="System.Reactive" Version="6.0.1"/>
<PackageVersion Include="System.Linq.Async" Version="6.0.1"/>
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0"/>
<PackageVersion Include="EventStore.Client.Grpc.PersistentSubscriptions" Version="23.3.3"/>
<PackageVersion Include="EventStore.Client.Grpc.Streams" Version="23.3.3"/>
<PackageVersion Include="MongoDB.Driver" Version="2.26.0"/>
<PackageVersion Include="Google.Cloud.PubSub.V1" Version="3.14.0"/>
<PackageVersion Include="Confluent.Kafka" Version="2.4.0"/>
<PackageVersion Include="Npgsql" Version="8.0.3"/>
<PackageVersion Include="Npgsql.DependencyInjection" Version="8.0.3"/>
<PackageVersion Include="RabbitMQ.Client" Version="6.6.0"/>
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.2.1"/>
<PackageVersion Include="NEST" Version="7.17.5"/>
<PackageVersion Include="Polly" Version="8.4.0"/>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3"/>
<PackageVersion Include="StackExchange.Redis" Version="2.6.90"/>
<PackageVersion Include="Verify.DiffPlex" Version="$(DiffPlexVersion)"/>
</ItemGroup>
<ItemGroup Label="Testcontainers">
<PackageVersion Include="Testcontainers" Version="$(TestcontainersVersion)"/>
<PackageVersion Include="Testcontainers.EventStoreDb" Version="$(TestcontainersVersion)"/>
<PackageVersion Include="Testcontainers.Kafka" Version="$(TestcontainersVersion)"/>
<PackageVersion Include="Testcontainers.MongoDb" Version="$(TestcontainersVersion)"/>
<PackageVersion Include="Testcontainers.PostgreSql" Version="$(TestcontainersVersion)"/>
<PackageVersion Include="Testcontainers.RabbitMq" Version="$(TestcontainersVersion)"/>
<PackageVersion Include="Testcontainers.Redis" Version="$(TestcontainersVersion)"/>
<PackageVersion Include="Testcontainers.SqlEdge" Version="$(TestcontainersVersion)"/>
</ItemGroup>
<ItemGroup Label="References for packable projects">
<PackageVersion Include="MinVer" Version="5.0.0" PrivateAssets="All"/>
<PackageVersion Include="JetBrains.Annotations" Version="2023.3.0" PrivateAssets="All"/>
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All"/>
</ItemGroup>
<ItemGroup Label="References for test projects">
<PackageVersion Include="AutoFixture" Version="4.18.1"/>
<PackageVersion Include="Bogus" Version="35.5.1"/>
<PackageVersion Include="FluentAssertions" Version="6.12.0"/>
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0"/>
<PackageVersion Include="xunit" Version="2.8.1"/>
<PackageVersion Include="xunit.abstractions" Version="2.0.3"/>
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.1" PrivateAssets="All"/>
<PackageVersion Include="coverlet.collector" Version="6.0.2" PrivateAssets="All"/>
<PackageVersion Include="Xunit.Extensions.Logging" Version="1.1.0"/>
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="$(MicrosoftTestHostVer)"/>
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="$(MicrosoftTestHostVer)"/>
<PackageVersion Include="RestSharp" Version="110.2.0"/>
<PackageVersion Include="Hypothesist" Version="3.0.88"/>
<PackageVersion Include="NodaTime" Version="3.1.9"/>
<PackageVersion Include="NodaTime.Serialization.SystemTextJson" Version="1.1.0"/>
<PackageVersion Include="MicroElements.AutoFixture.NodaTime" Version="1.0.0"/>
<PackageVersion Include="MongoDb.Bson.NodaTime" Version="3.0.0"/>
<PackageVersion Include="Verify" Version="25.0.3"/>
<PackageVersion Include="Verify.Xunit" Version="25.0.3"/>
</ItemGroup>
<ItemGroup Label="Packages for samples">
<PackageVersion Include="MongoDB.Driver.Core.Extensions.OpenTelemetry" Version="1.0.0"/>
<PackageVersion Include="Npgsql.OpenTelemetry" Version="8.0.3"/>
<PackageVersion Include="OpenTelemetry" Version="1.8.1"/>
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1"/>
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.8.0-rc.1"/>
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="1.8.1"/>
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.8.1"/>
<PackageVersion Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.8.0-beta.1"/>
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.1"/>
<PackageVersion Include="Serilog.Extensions.Hosting" Version="8.0.0"/>
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0"/>
<PackageVersion Include="Serilog.Sinks.Seq" Version="8.0.0"/>
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.6.2"/>
</ItemGroup>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<PropertyGroup Label="Microsoft extensions">
<MicrosoftExtensionsVer>8.0</MicrosoftExtensionsVer>
<MicrosoftHealthCheckVer>8.0.6</MicrosoftHealthCheckVer>
</PropertyGroup>
<PropertyGroup Label="Package versions for .NET 6" Condition="'$(TargetFramework)' == 'net6.0'">
<MicrosoftTestHostVer>[6.0.5,7)</MicrosoftTestHostVer>
<DiffPlexVersion>2.3.0</DiffPlexVersion>
</PropertyGroup>
<PropertyGroup Label="Package versions for .NET 8" Condition="'$(TargetFramework)' == 'net8.0'">
<MicrosoftTestHostVer>8.0.6</MicrosoftTestHostVer>
<DiffPlexVersion>3.0.0</DiffPlexVersion>
</PropertyGroup>
<PropertyGroup Label="Testcontainers version">
<TestcontainersVersion>3.9.0</TestcontainersVersion>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="BenchmarkDotNet" Version="0.13.12" />
<PackageVersion Include="FluentValidation" Version="11.9.2" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="$(MicrosoftHealthCheckVer)" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftExtensionsVer)" />
<PackageVersion Include="Shouldly" Version="4.2.1" />
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="8.0.1" />
<PackageVersion Include="System.Reactive" Version="6.0.1" />
<PackageVersion Include="System.Linq.Async" Version="6.0.1" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
<PackageVersion Include="EventStore.Client.Grpc.PersistentSubscriptions" Version="23.3.3" />
<PackageVersion Include="EventStore.Client.Grpc.Streams" Version="23.3.3" />
<PackageVersion Include="MongoDB.Driver" Version="2.26.0" />
<PackageVersion Include="Google.Cloud.PubSub.V1" Version="3.14.0" />
<PackageVersion Include="Confluent.Kafka" Version="2.4.0" />
<PackageVersion Include="Npgsql" Version="8.0.3" />
<PackageVersion Include="Npgsql.DependencyInjection" Version="8.0.3" />
<PackageVersion Include="RabbitMQ.Client" Version="6.6.0" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.2.1" />
<PackageVersion Include="NEST" Version="7.17.5" />
<PackageVersion Include="Polly" Version="8.4.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="StackExchange.Redis" Version="2.6.90" />
<PackageVersion Include="Verify.DiffPlex" Version="$(DiffPlexVersion)" />
</ItemGroup>
<ItemGroup Label="Testcontainers">
<PackageVersion Include="Testcontainers" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.EventStoreDb" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.Kafka" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.MongoDb" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.PostgreSql" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.RabbitMq" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.Redis" Version="$(TestcontainersVersion)" />
<PackageVersion Include="Testcontainers.SqlEdge" Version="$(TestcontainersVersion)" />
</ItemGroup>
<ItemGroup Label="References for packable projects">
<PackageVersion Include="MinVer" Version="5.0.0" PrivateAssets="All" />
<PackageVersion Include="JetBrains.Annotations" Version="2023.3.0" PrivateAssets="All" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
</ItemGroup>
<ItemGroup Label="References for test projects">
<PackageVersion Include="AutoFixture" Version="4.18.1" />
<PackageVersion Include="Bogus" Version="35.5.1" />
<PackageVersion Include="FluentAssertions" Version="6.12.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageVersion Include="xunit" Version="2.8.1" />
<PackageVersion Include="xunit.abstractions" Version="2.0.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.1" PrivateAssets="All" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" PrivateAssets="All" />
<PackageVersion Include="Xunit.Extensions.Logging" Version="1.1.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="$(MicrosoftTestHostVer)" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="$(MicrosoftTestHostVer)" />
<PackageVersion Include="RestSharp" Version="110.2.0" />
<PackageVersion Include="Hypothesist" Version="3.0.88" />
<PackageVersion Include="NodaTime" Version="3.1.9" />
<PackageVersion Include="NodaTime.Serialization.SystemTextJson" Version="1.1.0" />
<PackageVersion Include="MicroElements.AutoFixture.NodaTime" Version="1.0.0" />
<PackageVersion Include="MongoDb.Bson.NodaTime" Version="3.0.0" />
<PackageVersion Include="Verify" Version="25.0.3" />
<PackageVersion Include="Verify.Xunit" Version="25.0.3" />
</ItemGroup>
<ItemGroup Label="Packages for samples">
<PackageVersion Include="MongoDB.Driver.Core.Extensions.OpenTelemetry" Version="1.0.0" />
<PackageVersion Include="Npgsql.OpenTelemetry" Version="8.0.3" />
<PackageVersion Include="OpenTelemetry" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.8.0-rc.1" />
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.8.0-beta.1" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="8.0.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.Seq" Version="8.0.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.6.2" />
</ItemGroup>
</Project>
51 changes: 13 additions & 38 deletions samples/esdb/Bookings.Domain/Bookings/Booking.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,58 +6,32 @@ namespace Bookings.Domain.Bookings;

public class Booking : Aggregate<BookingState> {
public async Task BookRoom(
string guestId,
RoomId roomId,
StayPeriod period,
Money price,
Money prepaid,
DateTimeOffset bookedAt,
IsRoomAvailable isRoomAvailable
) {
string guestId,
RoomId roomId,
StayPeriod period,
Money price,
Money prepaid,
DateTimeOffset bookedAt,
IsRoomAvailable isRoomAvailable
) {
EnsureDoesntExist();
await EnsureRoomAvailable(roomId, period, isRoomAvailable);

var outstanding = price - prepaid;

Apply(
new V1.RoomBooked(
guestId,
roomId,
period.CheckIn,
period.CheckOut,
price.Amount,
prepaid.Amount,
outstanding.Amount,
price.Currency,
bookedAt
)
);
Apply(new V1.RoomBooked(guestId, roomId, period.CheckIn, period.CheckOut, price.Amount, prepaid.Amount, outstanding.Amount, price.Currency, bookedAt));

MarkFullyPaidIfNecessary(bookedAt);
}

public void RecordPayment(
Money paid,
string paymentId,
string paidBy,
DateTimeOffset paidAt
) {
public void RecordPayment(Money paid, string paymentId, string paidBy, DateTimeOffset paidAt) {
EnsureExists();

if (State.HasPaymentBeenRegistered(paymentId)) return;

var outstanding = State.Outstanding - paid;

Apply(
new V1.PaymentRecorded(
paid.Amount,
outstanding.Amount,
paid.Currency,
paymentId,
paidBy,
paidAt
)
);
Apply(new V1.PaymentRecorded(paid.Amount, outstanding.Amount, paid.Currency, paymentId, paidBy, paidAt));

MarkFullyPaidIfNecessary(paidAt);
MarkOverpaid(paidAt);
Expand All @@ -75,6 +49,7 @@ void MarkOverpaid(DateTimeOffset when) {

static async Task EnsureRoomAvailable(RoomId roomId, StayPeriod period, IsRoomAvailable isRoomAvailable) {
var roomAvailable = await isRoomAvailable(roomId, period);

if (!roomAvailable) throw new DomainException("Room not available");
}
}
}
38 changes: 20 additions & 18 deletions samples/esdb/Bookings.Domain/Bookings/BookingEvents.cs
Original file line number Diff line number Diff line change
@@ -1,32 +1,34 @@
using Eventuous;
using NodaTime;

// ReSharper disable NotAccessedPositionalProperty.Global

namespace Bookings.Domain.Bookings;

public static class BookingEvents {
public static class V1 {
[EventType("V1.RoomBooked")]
public record RoomBooked(
string GuestId,
string RoomId,
LocalDate CheckInDate,
LocalDate CheckOutDate,
float BookingPrice,
float PrepaidAmount,
float OutstandingAmount,
string Currency,
DateTimeOffset BookingDate
);
string GuestId,
string RoomId,
LocalDate CheckInDate,
LocalDate CheckOutDate,
float BookingPrice,
float PrepaidAmount,
float OutstandingAmount,
string Currency,
DateTimeOffset BookingDate
);

[EventType("V1.PaymentRecorded")]
public record PaymentRecorded(
float PaidAmount,
float Outstanding,
string Currency,
string PaymentId,
string PaidBy,
DateTimeOffset PaidAt
);
float PaidAmount,
float Outstanding,
string Currency,
string PaymentId,
string PaidBy,
DateTimeOffset PaidAt
);

[EventType("V1.FullyPaid")]
public record BookingFullyPaid(DateTimeOffset FullyPaidAt);
Expand All @@ -37,4 +39,4 @@ public record BookingOverpaid(DateTimeOffset OverpaidAt);
[EventType("V1.BookingCancelled")]
public record BookingCancelled(string CancelledBy, DateTimeOffset CancelledAt);
}
}
}
Loading

0 comments on commit 58b05ff

Please sign in to comment.