diff --git a/Directory.Packages.props b/Directory.Packages.props index d875379..6c58a7d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,14 +1,16 @@ - - - - - - + + + + + + + - - + + + \ No newline at end of file diff --git a/src/Ardalis.SharedKernel/Ardalis.SharedKernel.csproj b/src/Ardalis.SharedKernel/Ardalis.SharedKernel.csproj index bc61a88..3e55e32 100644 --- a/src/Ardalis.SharedKernel/Ardalis.SharedKernel.csproj +++ b/src/Ardalis.SharedKernel/Ardalis.SharedKernel.csproj @@ -13,9 +13,10 @@ https://github.com/ardalis/Ardalis.SharedKernel DDD;Shared Kernel;SharedKernel;Domain-Driven Design;Repository;Specification;ValueObject;Value Object;Ardalis;Clean;Clean Architecture;Clean Architecture Template icon.png - 3.0.1 + 4.0.0 - * Net9 + * Swapped out MediatR for Mediator Souregenerator and Mediator.Abstractions + * Updated dependencies to latest versions true true @@ -26,7 +27,7 @@ - + diff --git a/src/Ardalis.SharedKernel/DomainEventBase.cs b/src/Ardalis.SharedKernel/DomainEventBase.cs index 5bb7558..879d490 100644 --- a/src/Ardalis.SharedKernel/DomainEventBase.cs +++ b/src/Ardalis.SharedKernel/DomainEventBase.cs @@ -1,13 +1,12 @@ -using MediatR; +using Mediator; namespace Ardalis.SharedKernel; /// -/// A base type for domain events. Depends on MediatR INotification. +/// A base type for domain events. Depends on Mediator INotification. /// Includes DateOccurred which is set on creation. /// public abstract class DomainEventBase : INotification { public DateTime DateOccurred { get; protected set; } = DateTime.UtcNow; } - diff --git a/src/Ardalis.SharedKernel/ICommand.cs b/src/Ardalis.SharedKernel/ICommand.cs deleted file mode 100644 index 7367b2e..0000000 --- a/src/Ardalis.SharedKernel/ICommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MediatR; - -namespace Ardalis.SharedKernel; - -/// -/// Source: https://code-maze.com/cqrs-mediatr-fluentvalidation/ -/// -/// -public interface ICommand : IRequest -{ -} diff --git a/src/Ardalis.SharedKernel/ICommandHandler.cs b/src/Ardalis.SharedKernel/ICommandHandler.cs deleted file mode 100644 index 160925d..0000000 --- a/src/Ardalis.SharedKernel/ICommandHandler.cs +++ /dev/null @@ -1,13 +0,0 @@ -using MediatR; - -namespace Ardalis.SharedKernel; - -/// -/// Source: https://code-maze.com/cqrs-mediatr-fluentvalidation/ -/// -/// -/// -public interface ICommandHandler : IRequestHandler - where TCommand : ICommand -{ -} diff --git a/src/Ardalis.SharedKernel/IQuery.cs b/src/Ardalis.SharedKernel/IQuery.cs deleted file mode 100644 index f9019b9..0000000 --- a/src/Ardalis.SharedKernel/IQuery.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MediatR; - -namespace Ardalis.SharedKernel; - -/// -/// Source: https://code-maze.com/cqrs-mediatr-fluentvalidation/ -/// -/// -public interface IQuery : IRequest -{ -} diff --git a/src/Ardalis.SharedKernel/IQueryHandler.cs b/src/Ardalis.SharedKernel/IQueryHandler.cs deleted file mode 100644 index fff209b..0000000 --- a/src/Ardalis.SharedKernel/IQueryHandler.cs +++ /dev/null @@ -1,13 +0,0 @@ -using MediatR; - -namespace Ardalis.SharedKernel; - -/// -/// Source: https://code-maze.com/cqrs-mediatr-fluentvalidation/ -/// -/// -/// -public interface IQueryHandler : IRequestHandler - where TQuery : IQuery -{ -} diff --git a/src/Ardalis.SharedKernel/LoggingBehavior.cs b/src/Ardalis.SharedKernel/LoggingBehavior.cs index 27e8067..3a020a3 100644 --- a/src/Ardalis.SharedKernel/LoggingBehavior.cs +++ b/src/Ardalis.SharedKernel/LoggingBehavior.cs @@ -1,47 +1,33 @@ using System.Diagnostics; using System.Reflection; using Ardalis.GuardClauses; -using MediatR; +using Mediator; using Microsoft.Extensions.Logging; namespace Ardalis.SharedKernel; /// -/// Adds logging for all requests in MediatR pipeline. +/// Adds logging for all requests in Mediator pipeline. /// Configure by adding the service with a scoped lifetime -/// -/// Example for Autofac: -/// builder -/// .RegisterType<Mediator>() -/// .As<IMediator>() -/// .InstancePerLifetimeScope(); -/// -/// builder -/// .RegisterGeneric(typeof(LoggingBehavior<,>)) -/// .As(typeof(IPipelineBehavior<,>)) -/// .InstancePerLifetimeScope(); -/// /// /// /// -public class LoggingBehavior : IPipelineBehavior - where TRequest : IRequest +public class LoggingBehavior(ILogger> logger) + : IPipelineBehavior + where TRequest : IRequest { - private readonly ILogger _logger; + private readonly ILogger> _logger = logger; - public LoggingBehavior(ILogger logger) - { - _logger = logger; - } - - public async Task Handle(TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) + public async ValueTask Handle( + TRequest request, + MessageHandlerDelegate next, + CancellationToken cancellationToken) { Guard.Against.Null(request); if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Handling {RequestName}", typeof(TRequest).Name); - // Reflection! Could be a performance concern Type myType = request.GetType(); IList props = new List(myType.GetProperties()); foreach (PropertyInfo prop in props) @@ -53,11 +39,10 @@ public async Task Handle(TRequest request, RequestHandlerDelegate _logger; + private readonly ILogger _logger; - public MediatRDomainEventDispatcher(IMediator mediator, ILogger logger) + public MediatorDomainEventDispatcher(IMediator mediator, ILogger logger) { _mediator = mediator; _logger = logger; diff --git a/tests/Ardalis.SharedKernel.UnitTests/Ardalis.SharedKernel.UnitTests.csproj b/tests/Ardalis.SharedKernel.UnitTests/Ardalis.SharedKernel.UnitTests.csproj index e9284f4..a3b8301 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/Ardalis.SharedKernel.UnitTests.csproj +++ b/tests/Ardalis.SharedKernel.UnitTests/Ardalis.SharedKernel.UnitTests.csproj @@ -6,9 +6,11 @@ - + + + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/tests/Ardalis.SharedKernel.UnitTests/DomainEventBaseTests/DomainEventBase_Constructor.cs b/tests/Ardalis.SharedKernel.UnitTests/DomainEventBaseTests/DomainEventBase_Constructor.cs index f7ea65f..004db4d 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/DomainEventBaseTests/DomainEventBase_Constructor.cs +++ b/tests/Ardalis.SharedKernel.UnitTests/DomainEventBaseTests/DomainEventBase_Constructor.cs @@ -1,11 +1,10 @@ -using Xunit; -using FluentAssertions; +using Mediator; namespace Ardalis.SharedKernel.UnitTests.DomainEventBaseTests; -public class DomainEventBase_Constructor +public class DomainEventBase_Constructor : INotificationHandler { - private class TestDomainEvent : DomainEventBase { } + public class TestDomainEvent : DomainEventBase { } [Fact] public void SetsDateOccurredToCurrentDateTime() @@ -20,4 +19,9 @@ public void SetsDateOccurredToCurrentDateTime() domainEvent.DateOccurred.Should().BeOnOrAfter(beforeCreation); domainEvent.DateOccurred.Should().BeOnOrBefore(DateTime.UtcNow); } + + public ValueTask Handle(TestDomainEvent notification, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } } diff --git a/tests/Ardalis.SharedKernel.UnitTests/EntityBaseTests/EntityBase_AddDomainEvent.cs b/tests/Ardalis.SharedKernel.UnitTests/EntityBaseTests/EntityBase_AddDomainEvent.cs index 998f58c..2585ab0 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/EntityBaseTests/EntityBase_AddDomainEvent.cs +++ b/tests/Ardalis.SharedKernel.UnitTests/EntityBaseTests/EntityBase_AddDomainEvent.cs @@ -1,11 +1,10 @@ -using FluentAssertions; -using Xunit; +using Mediator; namespace Ardalis.SharedKernel.UnitTests.EntityBaseTests; -public class EntityBase_AddDomainEvent +public class EntityBase_AddDomainEvent : INotificationHandler { - private class TestDomainEvent : DomainEventBase { } + public class TestDomainEvent : DomainEventBase { } private class TestEntity : EntityBase { @@ -29,4 +28,9 @@ public void AddsDomainEventToEntity() entity.DomainEvents.Should().HaveCount(1); entity.DomainEvents.Should().AllBeOfType(); } + + public ValueTask Handle(EntityBase_AddDomainEvent.TestDomainEvent notification, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } } diff --git a/tests/Ardalis.SharedKernel.UnitTests/GlobalUsings.cs b/tests/Ardalis.SharedKernel.UnitTests/GlobalUsings.cs new file mode 100644 index 0000000..d0c09c4 --- /dev/null +++ b/tests/Ardalis.SharedKernel.UnitTests/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using Xunit; +global using AwesomeAssertions; diff --git a/tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEvents.cs b/tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEvents.cs similarity index 57% rename from tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEvents.cs rename to tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEvents.cs index 3e8535e..8dcd113 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEvents.cs +++ b/tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEvents.cs @@ -1,14 +1,12 @@ -using FluentAssertions; -using MediatR; +using Mediator; using Microsoft.Extensions.Logging.Abstractions; using Moq; -using Xunit; -namespace Ardalis.SharedKernel.UnitTests.MediatRDomainEventDispatcherTests; +namespace Ardalis.SharedKernel.UnitTests.MediatorDomainEventDispatcherTests; -public class DispatchAndClearEvents +public class DispatchAndClearEvents : INotificationHandler { - private class TestDomainEvent : DomainEventBase { } + public class TestDomainEvent : DomainEventBase { } private class TestEntity : EntityBase { public void AddTestDomainEvent() @@ -23,7 +21,7 @@ public async Task CallsPublishAndClearDomainEvents() { // Arrange var mediatorMock = new Mock(); - var domainEventDispatcher = new MediatRDomainEventDispatcher(mediatorMock.Object, NullLogger.Instance); + var domainEventDispatcher = new MediatorDomainEventDispatcher(mediatorMock.Object, NullLogger.Instance); var entity = new TestEntity(); entity.AddTestDomainEvent(); @@ -34,4 +32,9 @@ public async Task CallsPublishAndClearDomainEvents() mediatorMock.Verify(m => m.Publish(It.IsAny(), It.IsAny()), Times.Once); entity.DomainEvents.Should().BeEmpty(); } + + public ValueTask Handle(TestDomainEvent notification, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } } diff --git a/tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithGuidId.cs b/tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithGuidId.cs similarity index 61% rename from tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithGuidId.cs rename to tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithGuidId.cs index a2f9584..69151e1 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithGuidId.cs +++ b/tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithGuidId.cs @@ -1,14 +1,13 @@ -using FluentAssertions; -using MediatR; +using Mediator; using Microsoft.Extensions.Logging.Abstractions; using Moq; using Xunit; namespace Ardalis.SharedKernel.UnitTests.MediatRDomainEventDispatcherTests; -public class DispatchAndClearEventsWithGuidId +public class DispatchAndClearEventsWithGuidId : INotificationHandler { - private class TestDomainEvent : DomainEventBase { } + public class TestDomainEvent : DomainEventBase { } private class TestEntity : EntityBase { public void AddTestDomainEvent() @@ -23,7 +22,7 @@ public async Task CallsPublishAndClearDomainEvents() { // Arrange var mediatorMock = new Mock(); - var domainEventDispatcher = new MediatRDomainEventDispatcher(mediatorMock.Object, NullLogger.Instance); + var domainEventDispatcher = new MediatorDomainEventDispatcher(mediatorMock.Object, NullLogger.Instance); var entity = new TestEntity(); entity.AddTestDomainEvent(); @@ -34,4 +33,9 @@ public async Task CallsPublishAndClearDomainEvents() mediatorMock.Verify(m => m.Publish(It.IsAny(), It.IsAny()), Times.Once); entity.DomainEvents.Should().BeEmpty(); } + + public ValueTask Handle(DispatchAndClearEventsWithGuidId.TestDomainEvent notification, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } } diff --git a/tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithMixedIds.cs b/tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithMixedIds.cs similarity index 77% rename from tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithMixedIds.cs rename to tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithMixedIds.cs index 6cf4859..b101869 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithMixedIds.cs +++ b/tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithMixedIds.cs @@ -1,14 +1,13 @@ -using FluentAssertions; -using MediatR; +using Mediator; using Microsoft.Extensions.Logging.Abstractions; using Moq; using Xunit; namespace Ardalis.SharedKernel.UnitTests.MediatRDomainEventDispatcherTests; -public class DispatchAndClearEventsWithMixedIds +public class DispatchAndClearEventsWithMixedIds : INotificationHandler { - private class TestDomainEvent : DomainEventBase { } + public class TestDomainEvent : DomainEventBase { } public readonly record struct StronglyTyped { } private class TestEntity : EntityBase @@ -41,7 +40,7 @@ public async Task CallsPublishAndClearDomainEventsWithStronglyTypedId() { // Arrange var mediatorMock = new Mock(); - var domainEventDispatcher = new MediatRDomainEventDispatcher(mediatorMock.Object, NullLogger.Instance); + var domainEventDispatcher = new MediatorDomainEventDispatcher(mediatorMock.Object, NullLogger.Instance); var entity = new TestEntity(); var entityGuid = new TestEntityGuid(); var entityStronglyTyped = new TestEntityStronglyTyped(); @@ -58,4 +57,9 @@ public async Task CallsPublishAndClearDomainEventsWithStronglyTypedId() entityGuid.DomainEvents.Should().BeEmpty(); entityStronglyTyped.DomainEvents.Should().BeEmpty(); } + + public ValueTask Handle(TestDomainEvent notification, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } } diff --git a/tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithStronglyTypedIds.cs b/tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithStronglyTypedIds.cs similarity index 65% rename from tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithStronglyTypedIds.cs rename to tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithStronglyTypedIds.cs index 260a66d..56d7035 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/MediatRDomainEventDispatcherTests/DispatchAndClearEventsWithStronglyTypedIds.cs +++ b/tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithStronglyTypedIds.cs @@ -1,14 +1,13 @@ -using FluentAssertions; -using MediatR; +using Mediator; using Microsoft.Extensions.Logging.Abstractions; using Moq; using Xunit; namespace Ardalis.SharedKernel.UnitTests.MediatRDomainEventDispatcherTests; -public class DispatchAndClearEventsWithStronglyTypedIds +public class DispatchAndClearEventsWithStronglyTypedIds : INotificationHandler { - private class TestDomainEvent : DomainEventBase { } + public class TestDomainEvent : DomainEventBase { } public readonly record struct StronglyTyped { } @@ -26,8 +25,8 @@ public async Task CallsPublishAndClearDomainEventsWithStronglyTypedId() { // Arrange Mock mediatorMock = new Mock(); - MediatRDomainEventDispatcher domainEventDispatcher = - new(mediatorMock.Object, NullLogger.Instance); + MediatorDomainEventDispatcher domainEventDispatcher = + new(mediatorMock.Object, NullLogger.Instance); TestEntityStronglyTyped entity = new(); entity.AddTestDomainEvent(); @@ -38,4 +37,9 @@ public async Task CallsPublishAndClearDomainEventsWithStronglyTypedId() mediatorMock.Verify(m => m.Publish(It.IsAny(), It.IsAny()), Times.Once); entity.DomainEvents.Should().BeEmpty(); } + + public ValueTask Handle(TestDomainEvent notification, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } } diff --git a/tests/Ardalis.SharedKernel.UnitTests/ValueObjectTests/ValueObject_HashEquality.cs b/tests/Ardalis.SharedKernel.UnitTests/ValueObjectTests/ValueObject_HashEquality.cs index 13d5e59..2bd2603 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/ValueObjectTests/ValueObject_HashEquality.cs +++ b/tests/Ardalis.SharedKernel.UnitTests/ValueObjectTests/ValueObject_HashEquality.cs @@ -1,7 +1,4 @@ -using FluentAssertions; -using Xunit; - -namespace Ardalis.SharedKernel.UnitTests.ValueObjectTests; +namespace Ardalis.SharedKernel.UnitTests.ValueObjectTests; public class ValueObject_HashEquality { [Fact] diff --git a/tests/Ardalis.SharedKernel.UnitTests/ValueObjectTests/ValueObject_ValueEquality.cs b/tests/Ardalis.SharedKernel.UnitTests/ValueObjectTests/ValueObject_ValueEquality.cs index f8db681..b48a7b0 100644 --- a/tests/Ardalis.SharedKernel.UnitTests/ValueObjectTests/ValueObject_ValueEquality.cs +++ b/tests/Ardalis.SharedKernel.UnitTests/ValueObjectTests/ValueObject_ValueEquality.cs @@ -1,7 +1,4 @@ -using FluentAssertions; -using Xunit; - -namespace Ardalis.SharedKernel.UnitTests.ValueObjectTests; +namespace Ardalis.SharedKernel.UnitTests.ValueObjectTests; public class ValueObject_ValueEquality {