public IHandlerScope CreateScope() { if (_scopeFactory == null) { var provider = _serviceProviderAccessor(); if (provider == null) { throw new InvalidOperationException("container have not been setup properly yet."); } _scopeFactory = new MicrosoftHandlerScopeFactory(provider); } return(_scopeFactory.CreateScope()); }
public async Task Should_be_able_To_query_and_get_a_result() { var serviceProvider = new ServiceCollection() .AddScoped <IQueryHandler <FindUser, FindUserResult>, FindUserHandler>() .BuildServiceProvider(); var scopeFactory = new MicrosoftHandlerScopeFactory(serviceProvider); FindUserResult actual; using (var scope = scopeFactory.CreateScope()) { var invoker = new MessageInvoker(scope); var bus = new ScopedQueryBus(invoker); actual = await bus.QueryAsync(new FindUser()); } actual.Should().NotBeNull(); }
public async Task Should_be_able_to_handle_a_message_flow() { ManualResetEvent evt = new ManualResetEvent(false); var upgrade = new LogAdminUpgrades(evt); var serviceProvider = new ServiceCollection() .AddScoped <IMessageHandler <ActivateUser>, ActivateUserHandler>() .AddScoped <IMessageHandler <UserActivated>, UpgradeToAdminHandler>() .AddSingleton <IMessageHandler <UserBecameAdmin> >(upgrade) .AddScoped <IQueryHandler <FindUser, FindUserResult>, FindUserHandler>() .BuildServiceProvider(); var scopeFactory = new MicrosoftHandlerScopeFactory(serviceProvider); var inboundQueue = _fixture.OpenQueue("inbound", false); var outboundQueue = _fixture.OpenQueue("outbound", false); var token = new CancellationTokenSource(); using (var session = inboundQueue.BeginSession()) { await session.EnqueueAsync(new Message(new ActivateUser())); await session.SaveChanges(); } var listener1 = new QueueListener(inboundQueue, outboundQueue, scopeFactory); listener1.MessageInvokerFactory = scope => new MessageInvoker(scope); listener1.Logger = (level, queue, msg) => Console.WriteLine($"{level} {queue} {msg}"); var listener2 = new QueueListener(outboundQueue, outboundQueue, scopeFactory); listener2.MessageInvokerFactory = scope => new MessageInvoker(scope); listener2.Logger = (level, queue, msg) => Console.WriteLine($"{level} {queue} {msg}"); var t1 = listener1.RunAsync(token.Token); var t2 = listener2.RunAsync(token.Token); token.Cancel(); await Task.WhenAll(t1, t2); evt.WaitOne(500).Should().BeTrue(); }