Skip to content

Commit c7e3174

Browse files
Refactoring Domain Events
1 parent cfecbc5 commit c7e3174

12 files changed

Lines changed: 62 additions & 59 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using MediatR;
2+
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate;
3+
using Microsoft.Extensions.Logging;
4+
using Ordering.Domain.Events;
5+
using System;
6+
using System.Threading.Tasks;
7+
8+
namespace Ordering.API.Application.DomainEventHandlers
9+
{
10+
public class BuyerPaymentMethodVerifiedDomainEventHandler : IAsyncNotificationHandler<BuyerPaymentMethodVerifiedDomainEvent>
11+
{
12+
private readonly IOrderRepository<Order> _orderRepository;
13+
private readonly ILoggerFactory _logger;
14+
public BuyerPaymentMethodVerifiedDomainEventHandler(IOrderRepository<Order> orderRepository, ILoggerFactory logger)
15+
{
16+
_orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository));
17+
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
18+
}
19+
20+
// Domain Logic comment:
21+
// When the Buyer and Buyer's payment method have been created or verified that they existed,
22+
// then we can update the original Order with the BuyerId and PaymentId (foreign keys)
23+
public async Task Handle(BuyerPaymentMethodVerifiedDomainEvent buyerPaymentMethodVerifiedEvent)
24+
{
25+
var orderToUpdate = await _orderRepository.GetAsync(buyerPaymentMethodVerifiedEvent.OrderId);
26+
orderToUpdate.SetBuyerId(buyerPaymentMethodVerifiedEvent.Buyer.Id);
27+
orderToUpdate.SetPaymentId(buyerPaymentMethodVerifiedEvent.Payment.Id);
28+
29+
await _orderRepository.UnitOfWork
30+
.SaveEntitiesAsync();
31+
32+
_logger.CreateLogger(nameof(BuyerPaymentMethodVerifiedDomainEventHandler))
33+
.LogTrace($"Order with Id: {buyerPaymentMethodVerifiedEvent.OrderId} has been successfully updated with a payment method id: { buyerPaymentMethodVerifiedEvent.Payment.Id }");
34+
}
35+
}
36+
}

src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderCreatedDomainEventHandler.cs renamed to src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedDomainEventHandler.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@
88

99
namespace Ordering.API.Application.DomainEventHandlers
1010
{
11-
public class OrderCreatedDomainEventHandler : IAsyncNotificationHandler<OrderCreatedDomainEvent>
11+
public class OrderStartedDomainEventHandler : IAsyncNotificationHandler<OrderStartedDomainEvent>
1212
{
1313
private readonly ILoggerFactory _logger;
1414
private readonly IBuyerRepository<Buyer> _buyerRepository;
1515
private readonly IIdentityService _identityService;
1616

17-
public OrderCreatedDomainEventHandler(ILoggerFactory logger, IBuyerRepository<Buyer> buyerRepository, IIdentityService identityService)
17+
public OrderStartedDomainEventHandler(ILoggerFactory logger, IBuyerRepository<Buyer> buyerRepository, IIdentityService identityService)
1818
{
1919
_buyerRepository = buyerRepository ?? throw new ArgumentNullException(nameof(buyerRepository));
2020
_identityService = identityService ?? throw new ArgumentNullException(nameof(identityService));
2121
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
2222
}
2323

24-
public async Task Handle(OrderCreatedDomainEvent orderNotification)
24+
public async Task Handle(OrderStartedDomainEvent orderNotification)
2525
{
2626
var cardTypeId = orderNotification.CardTypeId != 0 ? orderNotification.CardTypeId : 1;
2727

@@ -33,7 +33,7 @@ public async Task Handle(OrderCreatedDomainEvent orderNotification)
3333
buyer = new Buyer(buyerGuid);
3434
}
3535

36-
var payment = buyer.AddPaymentMethod(cardTypeId,
36+
var paymentMethod = buyer.VerifyOrAddPaymentMethod(cardTypeId,
3737
$"Payment Method on {DateTime.UtcNow}",
3838
orderNotification.CardNumber,
3939
orderNotification.CardSecurityNumber,
@@ -46,7 +46,7 @@ public async Task Handle(OrderCreatedDomainEvent orderNotification)
4646
await _buyerRepository.UnitOfWork
4747
.SaveEntitiesAsync();
4848

49-
_logger.CreateLogger(nameof(OrderCreatedDomainEventHandler)).LogTrace($"A new payment method has been successfully added for orderId: {orderNotification.Order.Id}.");
49+
_logger.CreateLogger(nameof(OrderStartedDomainEventHandler)).LogTrace($"A new payment method has been successfully added for orderId: {orderNotification.Order.Id}.");
5050

5151
}
5252
}

src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/PaymentMethodCheckedDomainEventHandler.cs

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

src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ protected override void Load(ContainerBuilder builder)
2424
.Select(i => new KeyedService("IAsyncRequestHandler", i)));
2525

2626
builder
27-
.RegisterAssemblyTypes(typeof(OrderCreatedDomainEventHandler).GetTypeInfo().Assembly)
27+
.RegisterAssemblyTypes(typeof(OrderStartedDomainEventHandler).GetTypeInfo().Assembly)
2828
.Where(t => t.IsClosedTypeOf(typeof(IAsyncNotificationHandler<>)))
2929
.AsImplementedInterfaces();
3030

src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/Buyer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public Buyer(string identity) : this()
2424
IdentityGuid = !string.IsNullOrWhiteSpace(identity) ? identity : throw new ArgumentNullException(nameof(identity));
2525
}
2626

27-
public PaymentMethod AddPaymentMethod(
27+
public PaymentMethod VerifyOrAddPaymentMethod(
2828
int cardTypeId, string alias, string cardNumber,
2929
string securityNumber, string cardHolderName, DateTime expiration, int orderId)
3030
{
@@ -33,15 +33,15 @@ public PaymentMethod AddPaymentMethod(
3333

3434
if (existingPayment != null)
3535
{
36-
AddDomainEvent(new PaymentMethodCheckedDomainEvent(this, existingPayment, orderId));
36+
AddDomainEvent(new BuyerPaymentMethodVerifiedDomainEvent(this, existingPayment, orderId));
3737
return existingPayment;
3838
}
3939
else
4040
{
4141
var payment = new PaymentMethod(cardTypeId, alias, cardNumber, securityNumber, cardHolderName, expiration);
4242

4343
_paymentMethods.Add(payment);
44-
AddDomainEvent(new PaymentMethodCheckedDomainEvent(this, payment, orderId));
44+
AddDomainEvent(new BuyerPaymentMethodVerifiedDomainEvent(this, payment, orderId));
4545
return payment;
4646
}
4747
}

src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ public Order(Address address, int cardTypeId, string cardNumber, string cardSecu
5252
_orderDate = DateTime.UtcNow;
5353
Address = address;
5454

55-
// Add the OrderCreatedEvent to the domain events collection
55+
// Add the OrderStarterDomainEvent to the domain events collection
5656
// to be raised/dispatched when comitting changes into the Database [ After DbContext.SaveChanges() ]
57-
AddOrderCreatedDomainEvent(cardTypeId, cardNumber,
58-
cardSecurityNumber, cardHolderName, cardExpiration);
57+
AddOrderStartedDomainEvent(cardTypeId, cardNumber,
58+
cardSecurityNumber, cardHolderName, cardExpiration);
5959
}
6060

6161
// DDD Patterns comment
@@ -96,14 +96,14 @@ public void SetBuyerId(int id)
9696
_buyerId = id;
9797
}
9898

99-
private void AddOrderCreatedDomainEvent(int cardTypeId, string cardNumber,
99+
private void AddOrderStartedDomainEvent(int cardTypeId, string cardNumber,
100100
string cardSecurityNumber, string cardHolderName, DateTime cardExpiration)
101101
{
102-
var orderCreatedDomainEvent = new OrderCreatedDomainEvent(
102+
var orderStartedDomainEvent = new OrderStartedDomainEvent(
103103
this, cardTypeId, cardNumber, cardSecurityNumber,
104104
cardHolderName, cardExpiration);
105105

106-
AddDomainEvent(orderCreatedDomainEvent);
106+
this.AddDomainEvent(orderStartedDomainEvent);
107107
}
108108
}
109109
}

src/Services/Ordering/Ordering.Domain/Events/PaymentMethodCheckedDomainEvent.cs renamed to src/Services/Ordering/Ordering.Domain/Events/BuyerPaymentMethodVerifiedDomainEvent.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66

77
namespace Ordering.Domain.Events
88
{
9-
public class PaymentMethodCheckedDomainEvent
9+
public class BuyerPaymentMethodVerifiedDomainEvent
1010
: IAsyncNotification
1111
{
1212
public Buyer Buyer { get; private set; }
1313
public PaymentMethod Payment { get; private set; }
1414
public int OrderId { get; private set; }
1515

16-
public PaymentMethodCheckedDomainEvent(Buyer buyer, PaymentMethod payment, int orderId)
16+
public BuyerPaymentMethodVerifiedDomainEvent(Buyer buyer, PaymentMethod payment, int orderId)
1717
{
1818
Buyer = buyer;
1919
Payment = payment;

src/Services/Ordering/Ordering.Domain/Events/OrderCreatedDomainEvent.cs renamed to src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Ordering.Domain.Events
99
/// <summary>
1010
/// Event used when an order is created
1111
/// </summary>
12-
public class OrderCreatedDomainEvent
12+
public class OrderStartedDomainEvent
1313
: IAsyncNotification
1414
{
1515
public int CardTypeId { get; private set; }
@@ -19,7 +19,7 @@ public class OrderCreatedDomainEvent
1919
public DateTime CardExpiration { get; private set; }
2020
public Order Order { get; private set; }
2121

22-
public OrderCreatedDomainEvent(Order order,
22+
public OrderStartedDomainEvent(Order order,
2323
int cardTypeId, string cardNumber,
2424
string cardSecurityNumber, string cardHolderName,
2525
DateTime cardExpiration)

src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Ordering.Infrastructure
88
{
99
public static class MediatorExtension
1010
{
11-
public static async Task RaiseDomainEventsAsync(this IMediator mediator, OrderingContext ctx)
11+
public static async Task DispatchDomainEventsAsync(this IMediator mediator, OrderingContext ctx)
1212
{
1313
var domainEntities = ctx.ChangeTracker.Entries<Entity>().Where(x => x.Entity.DomainEvents != null && x.Entity.DomainEvents.Any());
1414
var domainEvents = domainEntities.SelectMany(x => x.Entity.DomainEvents).ToList();

src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ void ConfigureCardTypes(EntityTypeBuilder<CardType> cardTypesConfiguration)
239239
{
240240
var result = await base.SaveChangesAsync();
241241

242-
// Dispatch the Domain Events collection right after saving/commiting data into the database
243-
await _mediator.RaiseDomainEventsAsync(this);
242+
// Dispatch the Domain Events collection right after saving/committing data into the database
243+
await _mediator.DispatchDomainEventsAsync(this);
244244
return result;
245245
}
246246
}

0 commit comments

Comments
 (0)