diff --git a/src/DispatchR.Abstractions/IMediator.cs b/src/DispatchR.Abstractions/IMediator.cs new file mode 100644 index 0000000..96449d5 --- /dev/null +++ b/src/DispatchR.Abstractions/IMediator.cs @@ -0,0 +1,30 @@ +using DispatchR.Abstractions.Notification; +using DispatchR.Abstractions.Send; +using DispatchR.Abstractions.Stream; + +namespace DispatchR; + +public interface IMediator +{ + TResponse Send(IRequest request, + CancellationToken cancellationToken) where TRequest : class, IRequest; + + IAsyncEnumerable CreateStream(IStreamRequest request, + CancellationToken cancellationToken) where TRequest : class, IStreamRequest; + + ValueTask Publish(TNotification request, CancellationToken cancellationToken) + where TNotification : INotification; + + /// + /// This method is not recommended for performance-critical scenarios. + /// Use it only if it is strictly necessary, as its performance is lower compared + /// to similar methods in terms of both memory usage and CPU consumption. + /// + /// + /// An object that implements INotification + /// + /// + /// + [Obsolete(message: "This method has performance issues. Use only if strictly necessary", error: false)] + ValueTask Publish(object request, CancellationToken cancellationToken); +} diff --git a/src/DispatchR/IMediator.cs b/src/DispatchR/Mediator.cs similarity index 84% rename from src/DispatchR/IMediator.cs rename to src/DispatchR/Mediator.cs index c5f8a65..59ae114 100644 --- a/src/DispatchR/IMediator.cs +++ b/src/DispatchR/Mediator.cs @@ -7,33 +7,6 @@ namespace DispatchR; -public interface IMediator -{ - TResponse Send(IRequest request, - CancellationToken cancellationToken) where TRequest : class, IRequest; - - IAsyncEnumerable CreateStream(IStreamRequest request, - CancellationToken cancellationToken) where TRequest : class, IStreamRequest; - - ValueTask Publish(TNotification request, CancellationToken cancellationToken) - where TNotification : INotification; - - /// - /// This method is not recommended for performance-critical scenarios. - /// Use it only if it is strictly necessary, as its performance is lower compared - /// to similar methods in terms of both memory usage and CPU consumption. - /// - /// - /// An object that implements INotification - /// - /// - /// - [Obsolete(message: "This method has performance issues. Use only if strictly necessary", - error: false, - DiagnosticId = Constants.DiagnosticPerformanceIssue)] - ValueTask Publish(object request, CancellationToken cancellationToken); -} - public sealed class Mediator(IServiceProvider serviceProvider) : IMediator { public TResponse Send(IRequest request, @@ -73,6 +46,19 @@ public async ValueTask Publish(TNotification request, Cancellatio } } + /// + /// This method is not recommended for performance-critical scenarios. + /// Use it only if it is strictly necessary, as its performance is lower compared + /// to similar methods in terms of both memory usage and CPU consumption. + /// + /// + /// An object that implements INotification + /// + /// + /// + [Obsolete(message: "This method has performance issues. Use only if strictly necessary", + error: false, + DiagnosticId = Constants.DiagnosticPerformanceIssue)] public async ValueTask Publish(object request, CancellationToken cancellationToken) { ArgumentNullException.ThrowIfNull(request); diff --git a/src/DispatchR/TypeForwarders.cs b/src/DispatchR/TypeForwarders.cs new file mode 100644 index 0000000..9bc54a1 --- /dev/null +++ b/src/DispatchR/TypeForwarders.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly:TypeForwardedTo(typeof(DispatchR.IMediator))]