Skip to content

Commit 96f3c73

Browse files
author
Anthony Sneed
committed
Update entities to implement generic ICommandProcessor.
1 parent 1591a69 commit 96f3c73

File tree

7 files changed

+34
-52
lines changed

7 files changed

+34
-52
lines changed

reference-architecture/CustomerService/Domain/CustomerAggregate/CommandHandlers/CustomerCommandHandler.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
using System.Linq;
21
using System.Threading.Tasks;
32
using AutoMapper;
43
using Common.Integration.Events;
54
using CustomerService.Domain.CustomerAggregate.Commands;
6-
using CustomerService.Domain.CustomerAggregate.Events;
75
using CustomerService.Repositories;
86
using EventDriven.DDD.Abstractions.Commands;
97
using EventDriven.EventBus.Abstractions;
@@ -38,11 +36,9 @@ public async Task<CommandResult<Customer>> Handle(CreateCustomer command)
3836
{
3937
// Process command
4038
_logger.LogInformation("Handling command: {CommandName}", nameof(CreateCustomer));
41-
var events = command.Entity.Process(command);
39+
var domainEvent = command.Entity.Process(command);
4240

4341
// Apply events
44-
var domainEvent = events.OfType<CustomerCreated>().SingleOrDefault();
45-
if (domainEvent == null) return new CommandResult<Customer>(CommandOutcome.NotHandled);
4642
command.Entity.Apply(domainEvent);
4743

4844
// Persist entity

reference-architecture/CustomerService/Domain/CustomerAggregate/Customer.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using CustomerService.Domain.CustomerAggregate.Commands;
43
using CustomerService.Domain.CustomerAggregate.Events;
54
using EventDriven.DDD.Abstractions.Commands;
@@ -10,19 +9,16 @@ namespace CustomerService.Domain.CustomerAggregate
109
{
1110
public class Customer :
1211
Entity,
13-
ICommandProcessor<CreateCustomer>,
12+
ICommandProcessor<CreateCustomer, CustomerCreated>,
1413
IEventApplier<CustomerCreated>
1514
{
1615
public string FirstName { get; set; }
1716
public string LastName { get; set; }
1817
public Address ShippingAddress { get; set; }
1918

20-
public IEnumerable<IDomainEvent> Process(CreateCustomer command)
19+
public CustomerCreated Process(CreateCustomer command)
2120
// To process command, return one or more domain events
22-
=> new List<IDomainEvent>
23-
{
24-
new CustomerCreated(command.Entity)
25-
};
21+
=> new(command.Entity);
2622

2723
public void Apply(CustomerCreated domainEvent) =>
2824
// Set Id

reference-architecture/OrderService/Domain/OrderAggregate/CommandHandlers/OrderCommandHandler.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
using System.Linq;
21
using System.Threading.Tasks;
32
using EventDriven.DDD.Abstractions.Commands;
43
using Microsoft.Extensions.Logging;
54
using OrderService.Domain.OrderAggregate.Commands;
6-
using OrderService.Domain.OrderAggregate.Events;
75
using OrderService.Repositories;
86

97
namespace OrderService.Domain.OrderAggregate.CommandHandlers
@@ -30,11 +28,9 @@ public async Task<CommandResult<Order>> Handle(CreateOrder command)
3028
{
3129
// Process command
3230
_logger.LogInformation("Handling command: {CommandName}", nameof(CreateOrder));
33-
var events = command.Entity.Process(command);
31+
var domainEvent = command.Entity.Process(command);
3432

3533
// Apply events
36-
var domainEvent = events.OfType<OrderCreated>().SingleOrDefault();
37-
if (domainEvent == null) return new CommandResult<Order>(CommandOutcome.NotHandled);
3834
command.Entity.Apply(domainEvent);
3935

4036
// Persist entity
@@ -74,11 +70,9 @@ public async Task<CommandResult<Order>> Handle(ShipOrder command)
7470
_logger.LogInformation("Handling command: {CommandName}", nameof(ShipOrder));
7571
var entity = await _repository.GetOrder(command.EntityId);
7672
if (entity == null) return new CommandResult<Order>(CommandOutcome.NotFound);
77-
var events = entity.Process(command);
73+
var domainEvent = entity.Process(command);
7874

7975
// Apply events
80-
var domainEvent = events.OfType<OrderShipped>().SingleOrDefault();
81-
if (domainEvent == null) return new CommandResult<Order>(CommandOutcome.NotHandled);
8276
entity.Apply(domainEvent);
8377

8478
try
@@ -100,11 +94,9 @@ public async Task<CommandResult<Order>> Handle(CancelOrder command)
10094
_logger.LogInformation("Handling command: {CommandName}", nameof(CancelOrder));
10195
var entity = await _repository.GetOrder(command.EntityId);
10296
if (entity == null) return new CommandResult<Order>(CommandOutcome.NotFound);
103-
var events = entity.Process(command);
97+
var domainEvent = entity.Process(command);
10498

10599
// Apply events
106-
var domainEvent = events.OfType<OrderCancelled>().SingleOrDefault();
107-
if (domainEvent == null) return new CommandResult<Order>(CommandOutcome.NotHandled);
108100
entity.Apply(domainEvent);
109101

110102
try

reference-architecture/OrderService/Domain/OrderAggregate/Order.cs

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ namespace OrderService.Domain.OrderAggregate
1010
{
1111
public class Order :
1212
Entity,
13-
ICommandProcessor<CreateOrder>,
13+
ICommandProcessor<CreateOrder, OrderCreated>,
1414
IEventApplier<OrderCreated>,
15-
ICommandProcessor<ShipOrder>,
15+
ICommandProcessor<ShipOrder, OrderShipped>,
1616
IEventApplier<OrderShipped>,
17-
ICommandProcessor<CancelOrder>,
17+
ICommandProcessor<CancelOrder, OrderCancelled>,
1818
IEventApplier<OrderCancelled>
1919
{
2020
public Guid CustomerId { get; set; }
@@ -23,23 +23,17 @@ public class Order :
2323
public Address ShippingAddress { get; set; }
2424
public OrderState OrderState { get; set; }
2525

26-
public IEnumerable<IDomainEvent> Process(CreateOrder command)
26+
public OrderCreated Process(CreateOrder command)
2727
// To process command, return one or more domain events
28-
=> new List<IDomainEvent>
29-
{
30-
new OrderCreated(command.Entity)
31-
};
28+
=> new(command.Entity);
3229

3330
public void Apply(OrderCreated domainEvent) =>
3431
// Set Id
3532
Id = domainEvent.EntityId != default(Guid) ? domainEvent.EntityId : Guid.NewGuid();
3633

37-
public IEnumerable<IDomainEvent> Process(ShipOrder command)
34+
public OrderShipped Process(ShipOrder command)
3835
// To process command, return one or more domain events
39-
=> new List<IDomainEvent>
40-
{
41-
new OrderShipped(command.EntityId, command.ETag)
42-
};
36+
=> new OrderShipped(command.EntityId, command.ETag);
4337

4438
public void Apply(OrderShipped domainEvent)
4539
{
@@ -48,12 +42,9 @@ public void Apply(OrderShipped domainEvent)
4842
ETag = domainEvent.ETag;
4943
}
5044

51-
public IEnumerable<IDomainEvent> Process(CancelOrder command)
45+
public OrderCancelled Process(CancelOrder command)
5246
// To process command, return one or more domain events
53-
=> new List<IDomainEvent>
54-
{
55-
new OrderCancelled(command.EntityId, command.ETag)
56-
};
47+
=> new(command.EntityId, command.ETag);
5748

5849
public void Apply(OrderCancelled domainEvent)
5950
{

test/EventDriven.CQRS.Tests/CustomerCommandControllerTests.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using CustomerService.DTO.Write;
77
using CustomerService.Mapping;
88
using EventDriven.CQRS.Tests.Fakes;
9+
using EventDriven.EventBus.Abstractions;
910
using Microsoft.AspNetCore.Mvc;
1011
using Microsoft.Extensions.Logging.Abstractions;
1112
using Xunit;
@@ -27,7 +28,7 @@ public async Task Create_Adds_Customer()
2728
{
2829
// Arrange
2930
var handler = new CustomerCommandHandler(
30-
new FakeCustomerRepository(), new FakeEventBus(),
31+
new FakeCustomerRepository(), new FakeEventBus(new EventBusOptions()),
3132
_mapper, new NullLogger<CustomerCommandHandler>());
3233
var controller = new CustomerCommandController(handler, _mapper);
3334

@@ -37,29 +38,29 @@ public async Task Create_Adds_Customer()
3738
// Assert
3839
var createdResult = Assert.IsType<CreatedResult>(actionResult);
3940
var value = (Customer)createdResult.Value;
40-
Assert.Equal(Customers.Customer1.Id, value.Id);
41-
Assert.NotEqual(default(Guid).ToString(), value.ETag);
41+
Assert.Equal(Customers.Customer1.Id, value?.Id);
42+
Assert.NotEqual(default(Guid).ToString(), value?.ETag);
4243
}
4344

4445
[Fact]
4546
public async Task Update_Updates_Customer()
4647
{
4748
// Arrange
4849
var handler = new CustomerCommandHandler(
49-
new FakeCustomerRepository(), new FakeEventBus(),
50+
new FakeCustomerRepository(), new FakeEventBus(new EventBusOptions()),
5051
_mapper, new NullLogger<CustomerCommandHandler>());
5152
var controller = new CustomerCommandController(handler, _mapper);
5253
var customer = (await controller.Create(Customers.Customer1) as CreatedResult)?.Value as Customer;
53-
customer.ShippingAddress.City = "Los Angeles";
54+
customer!.ShippingAddress.City = "Los Angeles";
5455

5556
// Act
5657
var actionResult = await controller.Update(customer);
5758

5859
// Assert
5960
var objectResult = Assert.IsType<OkObjectResult>(actionResult);
6061
var value = (Customer)objectResult.Value;
61-
Assert.Equal(customer.Id, value.Id);
62-
Assert.NotEqual(customer.ETag, value.ETag);
62+
Assert.Equal(customer.Id, value?.Id);
63+
Assert.NotEqual(customer.ETag, value?.ETag);
6364
}
6465

6566
[Fact]
@@ -68,13 +69,13 @@ public async Task Remove_Removes_Customer()
6869
// Arrange
6970
var repository = new FakeCustomerRepository();
7071
var handler = new CustomerCommandHandler(
71-
repository, new FakeEventBus(),
72+
repository, new FakeEventBus(new EventBusOptions()),
7273
_mapper, new NullLogger<CustomerCommandHandler>());
7374
var controller = new CustomerCommandController(handler, _mapper);
7475
var customer = (await controller.Create(Customers.Customer1) as CreatedResult)?.Value as Customer;
7576

7677
// Act
77-
var actionResult = await controller.Remove(customer.Id);
78+
var actionResult = await controller.Remove(customer!.Id);
7879

7980
// Assert
8081
Assert.IsType<NoContentResult>(actionResult);

test/EventDriven.CQRS.Tests/CustomerQueryControllerTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using CustomerService.DTO.Read;
77
using CustomerService.Mapping;
88
using EventDriven.CQRS.Tests.Fakes;
9+
using EventDriven.EventBus.Abstractions;
910
using Microsoft.AspNetCore.Mvc;
1011
using Microsoft.Extensions.Logging.Abstractions;
1112
using Xunit;
@@ -27,7 +28,7 @@ public async Task Get_Retrieves_Customers()
2728
{
2829
// Arrange
2930
var repository = new FakeCustomerRepository();
30-
var handler = new CustomerCommandHandler(repository, new FakeEventBus(),
31+
var handler = new CustomerCommandHandler(repository, new FakeEventBus(new EventBusOptions()),
3132
_mapper, new NullLogger<CustomerCommandHandler>());
3233
var commandController = new CustomerCommandController(handler, _mapper);
3334
await commandController.Create(Customers.Customer1);
@@ -52,7 +53,7 @@ public async Task Get_Retrieves_Customer_By_Id()
5253
{
5354
// Arrange
5455
var repository = new FakeCustomerRepository();
55-
var handler = new CustomerCommandHandler(repository, new FakeEventBus(),
56+
var handler = new CustomerCommandHandler(repository, new FakeEventBus(new EventBusOptions()),
5657
_mapper, new NullLogger<CustomerCommandHandler>());
5758
var commandController = new CustomerCommandController(handler, _mapper);
5859
await commandController.Create(Customers.Customer1);

test/EventDriven.CQRS.Tests/Fakes/FakeEventBus.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
using System.Threading.Tasks;
2+
using EventDriven.EventBus.Abstractions;
23

34
namespace EventDriven.CQRS.Tests.Fakes
45
{
56
public class FakeEventBus : EventBus.Abstractions.EventBus
67
{
8+
public FakeEventBus(EventBusOptions eventBusOptions) : base(eventBusOptions)
9+
{
10+
}
11+
712
public override Task PublishAsync<TIntegrationEvent>(
813
TIntegrationEvent @event,
914
string topic = null,

0 commit comments

Comments
 (0)