2022-12-07 14:05:11 +01:00
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
2023-05-11 11:35:01 +02:00
|
|
|
using System.Linq.Expressions;
|
2022-12-07 14:05:11 +01:00
|
|
|
using System.Reflection;
|
|
|
|
|
|
2026-04-07 14:23:29 +02:00
|
|
|
namespace Finch.Communication;
|
2022-12-07 14:05:11 +01:00
|
|
|
|
|
|
|
|
internal class MessageSubscription<TMessage, TMessageHandler> : IMessageSubscription
|
|
|
|
|
where TMessage : class, IMessage
|
|
|
|
|
where TMessageHandler : IMessageHandler<TMessage>
|
|
|
|
|
{
|
|
|
|
|
public bool CanDeliver<T>()
|
|
|
|
|
{
|
|
|
|
|
return typeof(TMessage).GetTypeInfo().IsAssignableFrom(typeof(T));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task Deliver(IServiceProvider serviceProvider, object message)
|
|
|
|
|
{
|
|
|
|
|
if (message == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(nameof(message));
|
|
|
|
|
}
|
|
|
|
|
if (!(message is TMessage))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException($"{ nameof(message) } must be of type '{typeof(TMessage).FullName}'");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var handlers = serviceProvider.GetServices<TMessageHandler>();
|
|
|
|
|
|
|
|
|
|
foreach (var handler in handlers)
|
|
|
|
|
{
|
|
|
|
|
await handler.Handle((TMessage)message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-05-11 11:35:01 +02:00
|
|
|
internal class InlineMessageSubscription<TMessage> : IMessageSubscription
|
|
|
|
|
where TMessage : class, IMessage
|
|
|
|
|
{
|
|
|
|
|
private Expression<Func<TMessage, Task>> _handler;
|
|
|
|
|
|
|
|
|
|
public InlineMessageSubscription(Expression<Func<TMessage, Task>> handler)
|
|
|
|
|
{
|
|
|
|
|
_handler = handler;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public bool CanDeliver<T>()
|
|
|
|
|
{
|
|
|
|
|
return typeof(TMessage).GetTypeInfo().IsAssignableFrom(typeof(T));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task Deliver(IServiceProvider serviceProvider, object message)
|
|
|
|
|
{
|
|
|
|
|
if (message == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(nameof(message));
|
|
|
|
|
}
|
|
|
|
|
if (!(message is TMessage))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException($"{nameof(message)} must be of type '{typeof(TMessage).FullName}'");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await _handler.Compile()((TMessage)message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-12-07 14:05:11 +01:00
|
|
|
public interface IMessageSubscription
|
|
|
|
|
{
|
|
|
|
|
bool CanDeliver<TMessage>();
|
|
|
|
|
|
|
|
|
|
Task Deliver(IServiceProvider serviceProvider, object message);
|
|
|
|
|
}
|