diff --git a/SimpleMediator/Core/IMediator.cs b/SimpleMediator/Core/IMediator.cs index 803577d..314d945 100644 --- a/SimpleMediator/Core/IMediator.cs +++ b/SimpleMediator/Core/IMediator.cs @@ -5,7 +5,11 @@ namespace SimpleMediator.Core { public interface IMediator { - Task HandleAsync(IMessage message, IMediationContext mediationContext = default(IMediationContext), + Task HandleAsync(IMessage message, + IMediationContext mediationContext = default(IMediationContext), CancellationToken cancellationToken = default(CancellationToken)); + Task HandleAsync(TMessage message, + IMediationContext mediationContext = default(IMediationContext), + CancellationToken cancellationToken = default(CancellationToken)) where TMessage : IMessage; } } \ No newline at end of file diff --git a/SimpleMediator/Core/Mediator.cs b/SimpleMediator/Core/Mediator.cs index 6b88b2f..d19684d 100644 --- a/SimpleMediator/Core/Mediator.cs +++ b/SimpleMediator/Core/Mediator.cs @@ -16,7 +16,8 @@ public Mediator(IServiceFactory serviceFactory) } public Task HandleAsync(IMessage message, - IMediationContext mediationContext = default(MediationContext), CancellationToken cancellationToken = default(CancellationToken)) + IMediationContext mediationContext = default(IMediationContext), + CancellationToken cancellationToken = default(CancellationToken)) { if (mediationContext == null) { @@ -32,7 +33,25 @@ public Task HandleAsync(IMessage message, return result; } - private Task InvokeInstanceAsync(object instance, IMessage message, Type targetHandler, + public Task HandleAsync(TMessage message, + IMediationContext mediationContext = default(IMediationContext), + CancellationToken cancellationToken = default(CancellationToken)) where TMessage : IMessage + { + if (mediationContext == null) + { + mediationContext = MediationContext.Default; + } + + var targetHandler = typeof(IMessageProcessor); + var instance = _serviceFactory.GetInstance(targetHandler); + + var result = InvokeInstanceAsync(instance, message, targetHandler, mediationContext, cancellationToken); + + return result; + } + + private Task InvokeInstanceAsync(object instance, + IMessage message, Type targetHandler, IMediationContext mediationContext, CancellationToken cancellationToken) { var method = instance.GetType() @@ -45,7 +64,7 @@ private Task InvokeInstanceAsync(object instance, IMessage instance.GetType().FullName); } - return (Task) method.Invoke(instance, new object[] {message, mediationContext, cancellationToken}); + return (Task)method.Invoke(instance, new object[] { message, mediationContext, cancellationToken }); } } }