I want to add a items into the generic dictionary. Here is my example:
public class EventHandlerService : IEventHandlerService
{
private readonly Dictionary<EventType, IEventHandler<IEvent>> handlerDictionary = new Dictionary<EventType, IEventHandler<IEvent>>();
public EventHandlerService(IAzureBlobStorage azureBlobStorage)
{
handlerDictionary.Add(EventType.CARD_BLOCK, new CardBlockedEventHandler(azureBlobStorage));
}
public void HandleCommand(IEvent @event, ILogger log)
{
var commandHandler = handlerDictionary[@event.EventType];
commandHandler.HandleAsync(@event, log);
}
}
IEvent handler:
public interface IEventHandler<TEvent> where TEvent : IEvent
{
/// <summary>
///
/// </summary>
/// <param name="event"></param>
Task HandleAsync(TEvent @event, ILogger logger);
}
Handler:
public class CardBlockedEventHandler : IEventHandler<CardBlockedEvent>
{
private readonly IAzureBlobStorage _azureBlobStorage;
public CardBlockedEventHandler(IAzureBlobStorage azureBlobStorage)
{
_azureBlobStorage = azureBlobStorage;
}
public async Task HandleAsync(CardBlockedEvent cardBlockedEvent, ILogger log)
{
log.LogInformation($"Card blocked event received for account - {cardBlockedEvent.Message}");
throw new NotImplementedException();
}
}
IEvent interface:
public interface IEvent
{
EventType EventType { get; }
}
Can I create a kind of generic dictionary? Or I can only create with non-generic IEventHandler.
Thoughts?
I have already tried with non-generic IEventHandler, but in that case i am not able access the properties of CardBlockedEvent in the event handler:
public class CardBlockedEventHandler : IEventHandler
{
private readonly IAzureBlobStorage _azureBlobStorage;
public CardBlockedEventHandler(IAzureBlobStorage azureBlobStorage)
{
_azureBlobStorage = azureBlobStorage;
}
public Task HandleAsync<CardBlockedEvent>(CardBlockedEvent cardBlockedEvent, ILogger log) where CardBlockedEvent:IEvent
{
log.LogInformation($"Card blocked event received for account - {cardBlockedEvent.Message}");
throw new NotImplementedException();
}
}