Skip to content

Commit 4450ceb

Browse files
committed
MediatR demo of Domain Events
1 parent e399dae commit 4450ceb

File tree

9 files changed

+66
-23
lines changed

9 files changed

+66
-23
lines changed

Directory.Packages.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848
</PackageVersion>
4949
<PackageVersion Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
5050
<PackageVersion Include="Microsoft.Win32.Primitives" Version="4.3.0" />
51-
<PackageVersion Include="MinimalApi.Endpoint" Version="1.3.0" />
51+
<PackageVersion Include="Minimalpi.Endpoint" Version="1.3.0" />
52+
<PackageVersion Include="NimblePros.SharedKernel" Version="2.1.1" />
5253
<PackageVersion Include="NimblePros.Metronome" Version="0.4.1" />
5354
<PackageVersion Include="NSubstitute" Version="5.3.0" />
5455
<PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" />

src/ApplicationCore/ApplicationCore.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
<ItemGroup>
99
<PackageReference Include="Ardalis.GuardClauses" />
1010
<PackageReference Include="Ardalis.Result" />
11-
<PackageReference Include="Ardalis.Specification" />
12-
<PackageReference Include="System.Security.Claims" />
11+
<PackageReference Include="Ardalis.Specification" />
12+
<PackageReference Include="NimblePros.SharedKernel" />
13+
<PackageReference Include="System.Security.Claims" />
1314
<PackageReference Include="System.Text.Json" />
1415
</ItemGroup>
1516

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using Ardalis.SharedKernel;
2+
3+
namespace Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate.Events;
4+
public class OrderCreatedEvent(Order order) : DomainEventBase
5+
{
6+
public Order Order { get; init; } = order;
7+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using MediatR;
8+
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate.Events;
9+
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
10+
using Microsoft.Extensions.Logging;
11+
12+
namespace Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate.Handlers;
13+
14+
public class OrderCreatedHandler(ILogger<OrderCreatedHandler> logger, IEmailSender emailSender) : INotificationHandler<OrderCreatedEvent>
15+
{
16+
public async Task Handle(OrderCreatedEvent domainEvent, CancellationToken cancellationToken)
17+
{
18+
logger.LogInformation("Order #{orderId} placed: ", domainEvent.Order.Id);
19+
20+
await emailSender.SendEmailAsync("[email protected]",
21+
"Order Created",
22+
$"Order with id {domainEvent.Order.Id} was created.");
23+
}
24+
}

src/ApplicationCore/Services/OrderService.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System.Linq;
22
using System.Threading.Tasks;
33
using Ardalis.GuardClauses;
4+
using MediatR;
45
using Microsoft.eShopWeb.ApplicationCore.Entities;
56
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
67
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate;
8+
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate.Events;
79
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
810
using Microsoft.eShopWeb.ApplicationCore.Specifications;
911

@@ -15,16 +17,18 @@ public class OrderService : IOrderService
1517
private readonly IUriComposer _uriComposer;
1618
private readonly IRepository<Basket> _basketRepository;
1719
private readonly IRepository<CatalogItem> _itemRepository;
20+
private readonly IMediator _mediator;
1821

1922
public OrderService(IRepository<Basket> basketRepository,
2023
IRepository<CatalogItem> itemRepository,
2124
IRepository<Order> orderRepository,
22-
IUriComposer uriComposer)
25+
IUriComposer uriComposer, IMediator mediator)
2326
{
2427
_orderRepository = orderRepository;
2528
_uriComposer = uriComposer;
2629
_basketRepository = basketRepository;
2730
_itemRepository = itemRepository;
31+
_mediator = mediator;
2832
}
2933

3034
public async Task CreateOrderAsync(int basketId, Address shippingAddress)
@@ -49,5 +53,7 @@ public async Task CreateOrderAsync(int basketId, Address shippingAddress)
4953
var order = new Order(basket.BuyerId, shippingAddress, items);
5054

5155
await _orderRepository.AddAsync(order);
56+
OrderCreatedEvent orderCreatedEvent = new OrderCreatedEvent(order);
57+
await _mediator.Publish(orderCreatedEvent);
5258
}
5359
}

src/Infrastructure/Services/EmailSender.cs

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
3+
4+
namespace Microsoft.eShopWeb.Infrastructure.Services;
5+
6+
public class LoggerEmailSender(IAppLogger<LoggerEmailSender> logger): IEmailSender
7+
{
8+
public Task SendEmailAsync(string email, string subject, string message)
9+
{
10+
logger.LogInformation("to: {email}, subject: {emailSubject}, message: {emailMessage}", email, subject, message);
11+
return Task.CompletedTask;
12+
}
13+
}

src/Web/Configuration/ConfigureCoreServices.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public static IServiceCollection AddCoreServices(this IServiceCollection service
2323
services.AddSingleton<IUriComposer>(new UriComposer(catalogSettings));
2424

2525
services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>));
26-
services.AddTransient<IEmailSender, EmailSender>();
26+
services.AddTransient<IEmailSender, LoggerEmailSender>();
2727

2828
return services;
2929
}

src/Web/Configuration/ConfigureWebServices.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.eShopWeb.Web.Interfaces;
1+
using Microsoft.eShopWeb.ApplicationCore.Services;
2+
using Microsoft.eShopWeb.Web.Interfaces;
23
using Microsoft.eShopWeb.Web.Services;
34

45
namespace Microsoft.eShopWeb.Web.Configuration;
@@ -7,8 +8,13 @@ public static class ConfigureWebServices
78
{
89
public static IServiceCollection AddWebServices(this IServiceCollection services, IConfiguration configuration)
910
{
10-
services.AddMediatR(cfg =>
11-
cfg.RegisterServicesFromAssembly(typeof(BasketViewModelService).Assembly));
11+
// Add MediatR support for the services
12+
services.AddMediatR(cfg =>
13+
{
14+
cfg.RegisterServicesFromAssembly(typeof(BasketViewModelService).Assembly);
15+
cfg.RegisterServicesFromAssembly(typeof(OrderService).Assembly);
16+
}
17+
);
1218
services.AddScoped<IBasketViewModelService, BasketViewModelService>();
1319
services.AddScoped<CatalogViewModelService>();
1420
services.AddScoped<ICatalogItemViewModelService, CatalogItemViewModelService>();

0 commit comments

Comments
 (0)