C#C
C#3y ago
xonery

❔ Generics

Hi, I commented the code to explain my issue
    public async Task DispatchAsync(IEventContext context)
    {
        var @event = _dictionary.Resolve<IEvent<TAggregateIdentifier>, TAggregateIdentifier>(context.Identifier, context.Payload);

        // 1. So far
        //  @event.GetType() -> MyEvent

        await _domain.HandleDomainAsync(@event);
    }

    public async Task HandleDomainAsync<TEvent>(TEvent @event) where TEvent : IEvent<TAggregateIdentifier>
    {
        // 2. So far
        // typeof(TEvent) -> IEvent<TAggregateIdentifier>
        // @event.GetType() -> MyEvent

        // 3. I have to use MakeGenericType to retrieve a list of IDomainEventHandler<TAggregateRoot, TAggregateIdentifier, MyEvent>
        // as i cannot use TEvent directly.

        var type = typeof(IDomainEventHandler<,,>).MakeGenericType(typeof(TAggregateRoot), typeof(TAggregateIdentifier),
            @event.GetType());
        
        var service = _services.GetService(type);
        
        // 4. As GetService returned an object, I have to cast to IDomainEventHandler<TAggregateRoot, TAggregateIdentifier, TEvent>
        // so i can call service.HandleAsync(@event)

        // 5. This doesn't work tho, as typeof(TEvent) -> IEvent<TAggregateIdentifier>, witch makes sence
        if(service is IDomainEventHandler<TAggregateRoot, TAggregateIdentifier, TEvent> handler)
            await handler.HandleAsync(@event);

        // Question: I there any way I can make it working without using reflection to invoke HandleAsync ?
        // 
    }
Was this page helpful?