Skip to content

Commit 731d74a

Browse files
committed
(#130) Transactional Outbox Pattern
1 parent 18a3a39 commit 731d74a

File tree

155 files changed

+2693
-1669
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

155 files changed

+2693
-1669
lines changed

src/Microservices/Common/ClassifiedAds.Application/ApplicationServicesExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public static IServiceCollection AddApplicationServices(this IServiceCollection
1313
{
1414
services.AddScoped<Dispatcher>();
1515

16-
services.AddSingleton<IDomainEvents, DomainEvents>()
16+
services.AddScoped<IDomainEvents, DomainEvents>()
1717
.AddScoped(typeof(ICrudService<>), typeof(CrudService<>));
1818

1919
return services;

src/Microservices/Common/ClassifiedAds.Domain/Events/DomainEvents.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace ClassifiedAds.Domain.Events
1111
public class DomainEvents : IDomainEvents
1212
{
1313
private static List<Type> _handlers = new List<Type>();
14-
private static IServiceProvider _serviceProvider;
14+
private IServiceProvider _serviceProvider;
1515

1616
public static void RegisterHandlers(Assembly assembly, IServiceCollection services)
1717
{

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog.Api/ClassifiedAds.Services.AuditLog.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<PropertyGroup>
44
<TargetFramework>net6.0</TargetFramework>
55
<CodeAnalysisRuleSet>ClassifiedAds.ruleset</CodeAnalysisRuleSet>
6+
<UserSecretsId>c0d90214-b332-43c7-baa7-9a7ebf96ae71</UserSecretsId>
67
</PropertyGroup>
78

89
<ItemGroup>

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog.Api/Startup.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
using ClassifiedAds.Application;
2+
using ClassifiedAds.Domain.Infrastructure.MessageBrokers;
13
using ClassifiedAds.Infrastructure.DistributedTracing;
24
using ClassifiedAds.Infrastructure.Web.Filters;
35
using ClassifiedAds.Services.AuditLog.ConfigurationOptions;
6+
using ClassifiedAds.Services.AuditLog.DTOs;
7+
using ClassifiedAds.Services.AuditLog.Entities;
48
using Microsoft.AspNetCore.Authentication.JwtBearer;
59
using Microsoft.AspNetCore.Builder;
610
using Microsoft.AspNetCore.Hosting;
@@ -84,6 +88,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
8488
app.UseDeveloperExceptionPage();
8589
}
8690

91+
RunMessageBrokerReceivers(app.ApplicationServices.CreateScope().ServiceProvider);
92+
8793
app.UseRouting();
8894

8995
app.UseCors("AllowAnyOrigin");
@@ -96,5 +102,25 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
96102
endpoints.MapControllers();
97103
});
98104
}
105+
106+
private void RunMessageBrokerReceivers(IServiceProvider serviceProvider)
107+
{
108+
var auditLogCreatedEventReceiver = serviceProvider.GetService<IMessageReceiver<AuditLogCreatedEvent>>();
109+
110+
auditLogCreatedEventReceiver?.Receive(async (data, metaData) =>
111+
{
112+
try
113+
{
114+
using (var scope = serviceProvider.CreateScope())
115+
{
116+
var dispatcher = scope.ServiceProvider.GetRequiredService<Dispatcher>();
117+
data.AuditLog.Id = Guid.Empty;
118+
await dispatcher.DispatchAsync(new AddOrUpdateEntityCommand<AuditLogEntry>(data.AuditLog));
119+
}
120+
}
121+
catch (Exception ex)
122+
{ }
123+
});
124+
}
99125
}
100126
}

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog.Api/appsettings.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,27 @@
3131
}
3232
},
3333
"AllowedHosts": "*",
34+
"MessageBroker": {
35+
"Provider": "Fake",
36+
"RabbitMQ": {
37+
"HostName": "localhost",
38+
"UserName": "guest",
39+
"Password": "guest",
40+
"ExchangeName": "amq.direct",
41+
"RoutingKeys": {
42+
"AuditLogCreatedEvent": "classifiedadds_auditlogcreated"
43+
},
44+
"QueueNames": {
45+
"AuditLogCreatedEvent": "classifiedadds_auditlogcreated"
46+
}
47+
},
48+
"AzureQueue": {
49+
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net",
50+
"QueueNames": {
51+
"AuditLogCreatedEvent": "classifiedadds-auditlogcreated"
52+
}
53+
}
54+
},
3455
"Services": {
3556
"AuditLog": {
3657
"Grpc": "https://localhost:5002"

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog.Grpc/ClassifiedAds.Services.AuditLog.Grpc.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>net6.0</TargetFramework>
5+
<UserSecretsId>c0d90214-b332-43c7-baa7-9a7ebf96ae71</UserSecretsId>
56
</PropertyGroup>
67

78
<ItemGroup>

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog.Grpc/appsettings.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,27 @@
4242
}
4343
}
4444
},
45+
"MessageBroker": {
46+
"Provider": "Fake",
47+
"RabbitMQ": {
48+
"HostName": "localhost",
49+
"UserName": "guest",
50+
"Password": "guest",
51+
"ExchangeName": "amq.direct",
52+
"RoutingKeys": {
53+
"AuditLogCreatedEvent": "classifiedadds_auditlogcreated"
54+
},
55+
"QueueNames": {
56+
"AuditLogCreatedEvent": "classifiedadds_auditlogcreated"
57+
}
58+
},
59+
"AzureQueue": {
60+
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net",
61+
"QueueNames": {
62+
"AuditLogCreatedEvent": "classifiedadds-auditlogcreated"
63+
}
64+
}
65+
},
4566
"Services": {
4667
"AuditLog": {
4768
"Grpc": "https://localhost:5002"

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog/AuditLogModuleServiceCollectionExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
using ClassifiedAds.Domain.Repositories;
22
using ClassifiedAds.Services.AuditLog.ConfigurationOptions;
3+
using ClassifiedAds.Services.AuditLog.DTOs;
34
using ClassifiedAds.Services.AuditLog.Entities;
45
using ClassifiedAds.Services.AuditLog.Repositories;
5-
using ClassifiedAds.Services.AuditLog.Services;
66
using Microsoft.AspNetCore.Builder;
77
using Microsoft.EntityFrameworkCore;
8-
using System;
98
using System.Reflection;
109

1110
namespace Microsoft.Extensions.DependencyInjection
@@ -21,13 +20,14 @@ public static IServiceCollection AddAuditLogModule(this IServiceCollection servi
2120
sql.MigrationsAssembly(appSettings.ConnectionStrings.MigrationsAssembly);
2221
}
2322
}))
24-
.AddScoped<IRepository<AuditLogEntry, Guid>, Repository<AuditLogEntry, Guid>>()
25-
.AddScoped(typeof(IAuditLogService), typeof(AuditLogService));
23+
.AddScoped<IRepository<AuditLogEntry, Guid>, Repository<AuditLogEntry, Guid>>();
2624

2725
services.AddMessageHandlers(Assembly.GetExecutingAssembly());
2826

2927
services.AddAuthorizationPolicies(Assembly.GetExecutingAssembly());
3028

29+
services.AddMessageBusReceiver<AuditLogCreatedEvent>(appSettings.MessageBroker);
30+
3131
return services;
3232
}
3333

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using ClassifiedAds.Services.AuditLog.Entities;
2+
3+
namespace ClassifiedAds.Services.AuditLog.DTOs
4+
{
5+
public class AuditLogCreatedEvent
6+
{
7+
public AuditLogEntry AuditLog { get; set; }
8+
}
9+
}

src/Microservices/Services.AuditLog/ClassifiedAds.Services.AuditLog/Services/AuditLogService.cs

Lines changed: 0 additions & 33 deletions
This file was deleted.

0 commit comments

Comments
 (0)