Skip to content

Commit 4fb79ed

Browse files
author
Anthony Sneed
committed
Add logging behavior.
1 parent d186386 commit 4fb79ed

31 files changed

+114
-133
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using Common.Helpers;
2+
using MediatR;
3+
using Microsoft.Extensions.Logging;
4+
5+
namespace Common.Behaviors;
6+
7+
public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
8+
where TRequest : IRequest<TResponse>
9+
{
10+
private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;
11+
12+
public LoggingBehavior(
13+
ILogger<LoggingBehavior<TRequest, TResponse>> logger)
14+
{
15+
_logger = logger;
16+
}
17+
18+
public async Task<TResponse> Handle(
19+
TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
20+
{
21+
_logger.LogInformation("----- Handling command {CommandName}. Request: {@Command}",
22+
request.GetGenericTypeName(), request);
23+
var response = await next();
24+
_logger.LogInformation("----- Handled Command {CommandName}. Response: {@Response}",
25+
request.GetGenericTypeName(), response);
26+
27+
return response;
28+
}
29+
}

reference-architecture/Common/Common.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
<ItemGroup>
1010
<PackageReference Include="EventDriven.EventBus.Abstractions" Version="1.2.0" />
11+
<PackageReference Include="MediatR" Version="10.0.1" />
12+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.1" />
1113
</ItemGroup>
1214

1315
</Project>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
namespace Common.Helpers;
2+
3+
public static class GenericTypeExtensions
4+
{
5+
public static string GetGenericTypeName(this Type type)
6+
{
7+
string typeName;
8+
9+
if (type.IsGenericType)
10+
{
11+
var genericTypes = string.Join(",", type.GetGenericArguments().Select(t => t.Name).ToArray());
12+
typeName = $"{type.Name.Remove(type.Name.IndexOf('`'))}<{genericTypes}>";
13+
}
14+
else
15+
{
16+
typeName = type.Name;
17+
}
18+
19+
return typeName;
20+
}
21+
22+
public static string GetGenericTypeName(this object @object)
23+
{
24+
return @object.GetType().GetGenericTypeName();
25+
}
26+
}

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,16 @@ namespace CustomerService.Domain.CustomerAggregate.CommandHandlers;
77
public class CreateCustomerHandler : ICommandHandler<Customer, CreateCustomer>
88
{
99
private readonly ICustomerRepository _repository;
10-
private readonly ILogger<CreateCustomerHandler> _logger;
1110

1211
public CreateCustomerHandler(
13-
ICustomerRepository repository,
14-
ILogger<CreateCustomerHandler> logger)
12+
ICustomerRepository repository)
1513
{
1614
_repository = repository;
17-
_logger = logger;
1815
}
1916

2017
public async Task<CommandResult<Customer>> Handle(CreateCustomer command, CancellationToken cancellationToken)
2118
{
2219
// Process command
23-
_logger.LogInformation("Handling command: {CommandName}", nameof(CreateCustomer));
2420
if (command.Entity == null) return new CommandResult<Customer>(CommandOutcome.InvalidCommand);
2521
var domainEvent = command.Entity.Process(command);
2622

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,15 @@ namespace CustomerService.Domain.CustomerAggregate.CommandHandlers;
77
public class RemoveCustomerHandler : ICommandHandler<RemoveCustomer>
88
{
99
private readonly ICustomerRepository _repository;
10-
private readonly ILogger<RemoveCustomerHandler> _logger;
1110

1211
public RemoveCustomerHandler(
13-
ICustomerRepository repository,
14-
ILogger<RemoveCustomerHandler> logger)
12+
ICustomerRepository repository)
1513
{
1614
_repository = repository;
17-
_logger = logger;
1815
}
1916

2017
public async Task<CommandResult> Handle(RemoveCustomer command, CancellationToken cancellationToken)
2118
{
22-
_logger.LogInformation("Handling command: {CommandName}", nameof(RemoveCustomer));
2319
var entity = await _repository.GetAsync(command.EntityId);
2420
if (entity != null)
2521
{

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ public UpdateCustomerHandler(
3131
public async Task<CommandResult<Customer>> Handle(UpdateCustomer command, CancellationToken cancellationToken)
3232
{
3333
// Process command
34-
_logger.LogInformation("Handling command: {CommandName}", nameof(UpdateCustomer));
3534
if (command.Entity == null) return new CommandResult<Customer>(CommandOutcome.InvalidCommand);
3635
var domainEvent = command.Entity.Process(command);
3736

@@ -53,7 +52,7 @@ public async Task<CommandResult<Customer>> Handle(UpdateCustomer command, Cancel
5352
if (addressChanged)
5453
{
5554
var shippingAddress = _mapper.Map<Integration.Models.Address>(entity.ShippingAddress);
56-
_logger.LogInformation("Publishing event: {EventName}", $"v1.{nameof(CustomerAddressUpdated)}");
55+
_logger.LogInformation("----- Publishing event: {EventName}", $"v1.{nameof(CustomerAddressUpdated)}");
5756
await _eventBus.PublishAsync(
5857
new CustomerAddressUpdated(entity.Id, shippingAddress),
5958
null, "v1");

reference-architecture/CustomerService/Domain/CustomerAggregate/QueryHandlers/GetCustomerHandler.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,16 @@ namespace CustomerService.Domain.CustomerAggregate.QueryHandlers;
77
public class GetCustomerHandler : IQueryHandler<GetCustomer, Customer?>
88
{
99
private readonly ICustomerRepository _repository;
10-
private readonly ILogger<GetCustomerHandler> _logger;
1110

1211
public GetCustomerHandler(
13-
ICustomerRepository repository,
14-
ILogger<GetCustomerHandler> logger)
12+
ICustomerRepository repository)
1513
{
1614
_repository = repository;
17-
_logger = logger;
1815
}
1916

2017
public async Task<Customer?> Handle(GetCustomer query, CancellationToken cancellationToken)
2118
{
2219
// Retrieve entity
23-
_logger.LogInformation("Handling command: {CommandName}", nameof(GetCustomers));
2420
var result = await _repository.GetAsync(query.Id);
2521
return result;
2622
}

reference-architecture/CustomerService/Domain/CustomerAggregate/QueryHandlers/GetCustomersHandler.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,16 @@ namespace CustomerService.Domain.CustomerAggregate.QueryHandlers;
77
public class GetCustomersHandler : IQueryHandler<GetCustomers, IEnumerable<Customer>>
88
{
99
private readonly ICustomerRepository _repository;
10-
private readonly ILogger<GetCustomersHandler> _logger;
1110

1211
public GetCustomersHandler(
13-
ICustomerRepository repository,
14-
ILogger<GetCustomersHandler> logger)
12+
ICustomerRepository repository)
1513
{
1614
_repository = repository;
17-
_logger = logger;
1815
}
1916

2017
public async Task<IEnumerable<Customer>> Handle(GetCustomers query, CancellationToken cancellationToken)
2118
{
2219
// Retrieve entities
23-
_logger.LogInformation("Handling command: {CommandName}", nameof(GetCustomers));
2420
var result = await _repository.GetAsync();
2521
return result;
2622
}

reference-architecture/CustomerService/Program.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
using Common.Behaviors;
12
using CustomerService.Configuration;
23
using CustomerService.Domain.CustomerAggregate;
34
using CustomerService.Repositories;
45
using EventDriven.CQRS.Abstractions.DependencyInjection;
56
using EventDriven.DependencyInjection.URF.Mongo;
7+
using MediatR;
68

79
var builder = WebApplication.CreateBuilder(args);
810

@@ -17,6 +19,9 @@
1719
// Add command and query handlers
1820
builder.Services.AddHandlers(typeof(Program));
1921

22+
// Add behaviors
23+
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
24+
2025
// Add database settings
2126
builder.Services.AddSingleton<ICustomerRepository, CustomerRepository>();
2227
builder.Services.AddMongoDbSettings<CustomerDatabaseSettings, Customer>(builder.Configuration);

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,16 @@ namespace OrderService.Domain.OrderAggregate.CommandHandlers;
88
public class CancelOrderHandler : ICommandHandler<Order, CancelOrder>
99
{
1010
private readonly IOrderRepository _repository;
11-
private readonly ILogger<CancelOrderHandler> _logger;
1211

1312
public CancelOrderHandler(
14-
IOrderRepository repository,
15-
ILogger<CancelOrderHandler> logger)
13+
IOrderRepository repository)
1614
{
1715
_repository = repository;
18-
_logger = logger;
1916
}
2017

2118
public async Task<CommandResult<Order>> Handle(CancelOrder command, CancellationToken cancellationToken)
2219
{
2320
// Process command
24-
_logger.LogInformation("Handling command: {CommandName}", nameof(CancelOrder));
2521
var entity = await _repository.GetAsync(command.EntityId);
2622
if (entity == null) return new CommandResult<Order>(CommandOutcome.NotFound);
2723
var domainEvent = entity.Process(command);

0 commit comments

Comments
 (0)