CQRSMicroservices.ServiceFabric.EventBusService.ServiceFabricEventBus.Dispatch C# (CSharp) Method

Dispatch() public method

public Dispatch ( Event @event ) : System.Threading.Tasks.Task
@event CQRSMicroservices.Framework.Event
return System.Threading.Tasks.Task
    public override async Task Dispatch(Event @event)
    {
      List<QueryModelBuilder> handlers;
      if(_handlers.TryGetValue(@event.GetType(), out handlers))
      {
        await Task.WhenAll(
          handlers.Select(b =>
          {
            var builderType = b.GetType();
            var queryModelBuilderService = ServiceProxy.Create<IQueryModelBuilderService>(
              $"{builderType.FullName}, {builderType.Assembly.GetName().Name}",
              new Uri("fabric:/CQRSMicroservices.ServiceFabric.Application/QueryModelBuilderService"
            ));
            return queryModelBuilderService.Handle(@event.ToJson());
          })
        );
      }
      else
      {
        throw new NotImplementedException($"No handler for eventtype {@event.GetType().FullName}");
      }
    }
  }

Usage Example

    /// <summary>
    /// This is the main entry point for your service's partition replica. 
    /// RunAsync executes when the primary replica for this partition has write status.
    /// </summary>
    /// <param name="cancellationToken">Canceled when Service Fabric terminates this partition's replica.</param>
    protected override async Task RunAsync(CancellationToken cancellationToken)
    {
      var queue = await StateManager.GetOrAddAsync<IReliableQueue<string>>("eventBusQueue");

      // We use the ServiceFabricEventBus as our way of dispatching in this service.
      // The class has all the registered builders and can locate them through the ServiceClient.

      var eventBus = new ServiceFabricEventBus();
      Handlers.QueryModelBuilders.ToList().ForEach(eventBus.RegisterBuilder);
      var deserializer = new Deserializer();

      var count = (int)await queue.GetCountAsync();
      if(count > 0)
      {
        _semaphore.Release(count);
      }

      while(true)
      {
        cancellationToken.ThrowIfCancellationRequested();

        using(ITransaction tx = StateManager.CreateTransaction())
        {
          ConditionalResult<string> dequeueReply = await queue.TryDequeueAsync(tx);
          if(dequeueReply.HasValue)
          {
            string message = dequeueReply.Value;
            await eventBus.Dispatch(deserializer.CreateEvent(JObject.Parse(message)));
            await tx.CommitAsync();
          }
        }

        await _semaphore.WaitAsync(cancellationToken);
      }
    }
All Usage Examples Of CQRSMicroservices.ServiceFabric.EventBusService.ServiceFabricEventBus::Dispatch
ServiceFabricEventBus