diff --git a/.gitignore b/.gitignore index 97d9fd7f..4f684508 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ obj/ *.received.* nugets/ /TestResults +.claude/settings.local.json diff --git a/src/SqlServer.Deduplication.SampleEndpoint/Program.cs b/src/SqlServer.Deduplication.SampleEndpoint/Program.cs index ddb7e2aa..8ae9c425 100644 --- a/src/SqlServer.Deduplication.SampleEndpoint/Program.cs +++ b/src/SqlServer.Deduplication.SampleEndpoint/Program.cs @@ -1,15 +1,16 @@ -using Microsoft.Data.SqlClient; -using NServiceBus.Logging; +using Microsoft.Data.SqlClient; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using NServiceBus.Transport.SqlServerDeduplication; using SampleNamespace; class Program { const string connection = @"Server=.\SQLExpress;Database=DedupeSample; Integrated Security=True;Max Pool Size=100;TrustServerCertificate=True"; - static async Task Main() + static async Task Main(string[] args) { - var defaultFactory = LogManager.Use(); - defaultFactory.Level(LogLevel.Info); + Console.Title = "SampleEndpoint Press Ctrl-C to Exit."; var configuration = new EndpointConfiguration("SampleEndpoint"); configuration.EnableInstallers(); @@ -20,13 +21,18 @@ static async Task Main() var transport = configuration.UseTransport(); transport.ConnectionString(connection); transport.Transactions(TransportTransactionMode.SendsAtomicWithReceive); - configuration.EnableInstallers(); - Console.Title = "SampleEndpoint Press Ctrl-C to Exit."; - Console.TreatControlCAsInput = true; - var endpoint = await Endpoint.Start(configuration); - await SendMessages(endpoint); + + var builder = Host.CreateApplicationBuilder(args); + builder.Logging.SetMinimumLevel(LogLevel.Information); + builder.Services.AddNServiceBusEndpoint(configuration); + var host = builder.Build(); + await host.StartAsync(); + + var session = host.Services.GetRequiredService(); + await SendMessages(session); + Console.ReadKey(true); - await endpoint.Stop(); + await host.StopAsync(); } static async Task ConnectionBuilder(Cancel cancel) @@ -44,20 +50,20 @@ static async Task ConnectionBuilder(Cancel cancel) } } - static async Task SendMessages(IEndpointInstance endpoint) + static async Task SendMessages(IMessageSession session) { var guid = Guid.NewGuid(); - var dedupeOutcome1 = await SendMessage(endpoint, guid); + var dedupeOutcome1 = await SendMessage(session, guid); Console.WriteLine($"DedupeOutcome:{dedupeOutcome1.DedupeOutcome}. Context:{dedupeOutcome1.Context}"); - var dedupeOutcome2 = await SendMessage(endpoint, guid); + var dedupeOutcome2 = await SendMessage(session, guid); Console.WriteLine($"DedupeOutcome:{dedupeOutcome2.DedupeOutcome}. Context:{dedupeOutcome2.Context}"); } - static Task SendMessage(IEndpointInstance endpoint, Guid guid) + static Task SendMessage(IMessageSession session, Guid guid) { var message = new SampleMessage(); var options = new SendOptions(); options.RouteToThisEndpoint(); - return endpoint.SendWithDedupe(guid, message, options); + return session.SendWithDedupe(guid, message, options); } -} \ No newline at end of file +} diff --git a/src/SqlServer.HttpPassthrough.SampleEndpoint/Program.cs b/src/SqlServer.HttpPassthrough.SampleEndpoint/Program.cs index 27a7eac6..e517b242 100644 --- a/src/SqlServer.HttpPassthrough.SampleEndpoint/Program.cs +++ b/src/SqlServer.HttpPassthrough.SampleEndpoint/Program.cs @@ -1,22 +1,20 @@ -using NServiceBus.Attachments.Sql; +using Microsoft.Extensions.Hosting; +using NServiceBus.Attachments.Sql; -class Program -{ - static async Task Main() - { - var configuration = new EndpointConfiguration("SampleEndpoint"); - configuration.UsePersistence(); - var attachments = configuration.EnableAttachments(Connection.ConnectionString, TimeToKeep.Default); - attachments.UseTransportConnectivity(); - configuration.UseSerialization(); - configuration.PurgeOnStartup(true); - var transport = configuration.UseTransport(); - transport.ConnectionString(Connection.ConnectionString); - configuration.EnableInstallers(); - Console.Title = "SampleEndpoint Press Ctrl-C to Exit."; - Console.TreatControlCAsInput = true; - var endpoint = await Endpoint.Start(configuration); - Console.ReadKey(true); - await endpoint.Stop(); - } -} \ No newline at end of file +Console.Title = "SampleEndpoint Press Ctrl-C to Exit."; + +var builder = Host.CreateApplicationBuilder(args); + +var configuration = new EndpointConfiguration("SampleEndpoint"); +configuration.UsePersistence(); +var attachments = configuration.EnableAttachments(Connection.ConnectionString, TimeToKeep.Default); +attachments.UseTransportConnectivity(); +configuration.UseSerialization(); +configuration.PurgeOnStartup(true); +var transport = configuration.UseTransport(); +transport.ConnectionString(Connection.ConnectionString); +configuration.EnableInstallers(); + +builder.Services.AddNServiceBusEndpoint(configuration); + +await builder.Build().RunAsync(); diff --git a/src/SqlServer.Native.SubscriptionSampleEndpoint/Program.cs b/src/SqlServer.Native.SubscriptionSampleEndpoint/Program.cs index daf4c9d1..40bfaecf 100644 --- a/src/SqlServer.Native.SubscriptionSampleEndpoint/Program.cs +++ b/src/SqlServer.Native.SubscriptionSampleEndpoint/Program.cs @@ -1,16 +1,17 @@ -using Microsoft.Data.SqlClient; -using NServiceBus.Logging; +using Microsoft.Data.SqlClient; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using NServiceBus.Transport.SqlServerNative; using SampleNamespace; class Program { const string connection = @"Server=.\SQLExpress;Database=SubscriptionSample; Integrated Security=True;Max Pool Size=100;TrustServerCertificate=True"; - static async Task Main() + static async Task Main(string[] args) { await CreateTables(); - var defaultFactory = LogManager.Use(); - defaultFactory.Level(LogLevel.Info); + Console.Title = "SampleEndpoint Press Ctrl-C to Exit."; var configuration = new EndpointConfiguration("SampleEndpoint"); configuration.UsePersistence(); @@ -19,14 +20,19 @@ static async Task Main() var transport = configuration.UseTransport(); transport.ConnectionString(connection); transport.Transactions(TransportTransactionMode.SendsAtomicWithReceive); - configuration.EnableInstallers(); - Console.Title = "SampleEndpoint Press Ctrl-C to Exit."; - Console.TreatControlCAsInput = true; - var endpoint = await Endpoint.Start(configuration); - await Publish(endpoint); + + var builder = Host.CreateApplicationBuilder(args); + builder.Logging.SetMinimumLevel(LogLevel.Information); + builder.Services.AddNServiceBusEndpoint(configuration); + var host = builder.Build(); + await host.StartAsync(); + + var session = host.Services.GetRequiredService(); + await Publish(session); + Console.ReadKey(true); - await endpoint.Stop(); + await host.StopAsync(); } static async Task CreateTables() @@ -55,9 +61,9 @@ static async Task ConnectionBuilder() } } - static Task Publish(IEndpointInstance endpoint) + static Task Publish(IMessageSession session) { var message = new SampleMessage(); - return endpoint.Publish(message); + return session.Publish(message); } -} \ No newline at end of file +} diff --git a/src/SqlServer.Native.Tests/DedupeIntegrationTests.cs b/src/SqlServer.Native.Tests/DedupeIntegrationTests.cs index 5ef398dd..4c86209a 100644 --- a/src/SqlServer.Native.Tests/DedupeIntegrationTests.cs +++ b/src/SqlServer.Native.Tests/DedupeIntegrationTests.cs @@ -1,4 +1,4 @@ -using NServiceBus.Attachments.Sql; +using NServiceBus.Attachments.Sql; using DedupeOutcome = NServiceBus.Transport.SqlServerDeduplication.DedupeOutcome; using DedupeResult = NServiceBus.Transport.SqlServerDeduplication.DedupeResult; @@ -10,12 +10,12 @@ public class DedupeIntegrationTests : [Test] public async Task Integration() { - var endpoint = await StartEndpoint(); + var (host, session) = await StartEndpoint(); var messageId = Guid.NewGuid(); - var result = await SendMessage(messageId, endpoint, "context1"); + var result = await SendMessage(messageId, session, "context1"); await Assert.That(result.Context).IsEqualTo("context1"); await Assert.That(result.DedupeOutcome).IsEqualTo(DedupeOutcome.Sent); - result = await SendMessage(messageId, endpoint, "context2"); + result = await SendMessage(messageId, session, "context2"); await Assert.That(result.Context).IsEqualTo("context1"); await Assert.That(result.DedupeOutcome).IsEqualTo(DedupeOutcome.Deduplicated); if (!countdown.Wait(TimeSpan.FromSeconds(20))) @@ -23,14 +23,14 @@ public async Task Integration() throw new("Expected dedup"); } - await endpoint.Stop(); + await host.StopAsync(); } - static async Task SendMessage(Guid messageId, IEndpointInstance endpoint, string context) + static async Task SendMessage(Guid messageId, IMessageSession session, string context) { var sendOptions = new SendOptions(); sendOptions.RouteToThisEndpoint(); - var sendWithDedupe = await endpoint.SendWithDedupe(messageId, new MyMessage(), sendOptions,context); + var sendWithDedupe = await session.SendWithDedupe(messageId, new MyMessage(), sendOptions, context); if (sendWithDedupe.DedupeOutcome == DedupeOutcome.Deduplicated) { countdown.Signal(); @@ -38,7 +38,7 @@ static async Task SendMessage(Guid messageId, IEndpointInstance en return sendWithDedupe; } - static Task StartEndpoint() + static async Task<(IHost, IMessageSession)> StartEndpoint() { var configuration = new EndpointConfiguration(nameof(DedupeIntegrationTests)); configuration.UsePersistence(); @@ -53,7 +53,12 @@ static Task StartEndpoint() var transport = configuration.UseTransport(); transport.ConnectionString(Connection.ConnectionString); transport.NativeDelayedDelivery(); - return Endpoint.Start(configuration); + + var builder = Host.CreateApplicationBuilder(); + builder.Services.AddNServiceBusEndpoint(configuration); + var host = builder.Build(); + await host.StartAsync(); + return (host, host.Services.GetRequiredService()); } class Handler : diff --git a/src/SqlServer.Native.Tests/GlobalUsings.cs b/src/SqlServer.Native.Tests/GlobalUsings.cs index f192d497..71a8b6e7 100644 --- a/src/SqlServer.Native.Tests/GlobalUsings.cs +++ b/src/SqlServer.Native.Tests/GlobalUsings.cs @@ -1,6 +1,7 @@ global using System.Security.Claims; global using Microsoft.Data.SqlClient; global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Hosting; global using NServiceBus.SqlServer.HttpPassthrough; global using NServiceBus.Transport.SqlServerNative; diff --git a/src/SqlServer.Native.Tests/HttpPassthrough/IntegrationTest/HttpPassthroughDedupTests.cs b/src/SqlServer.Native.Tests/HttpPassthrough/IntegrationTest/HttpPassthroughDedupTests.cs index b5b86155..fbc7b1ed 100644 --- a/src/SqlServer.Native.Tests/HttpPassthrough/IntegrationTest/HttpPassthroughDedupTests.cs +++ b/src/SqlServer.Native.Tests/HttpPassthrough/IntegrationTest/HttpPassthroughDedupTests.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.TestHost; using HttpContext = Microsoft.AspNetCore.Http.HttpContext; @@ -18,7 +18,7 @@ public async Task Integration() await manager.Create(); } - var endpoint = await StartEndpoint(); + var host = await StartEndpoint(); var hostBuilder = new WebHostBuilder() .ConfigureServices(services => @@ -58,7 +58,7 @@ public async Task Integration() Thread.Sleep(3000); - await endpoint.Stop(); + await host.StopAsync(); await Assert.That(count).IsEqualTo(1); } @@ -74,10 +74,14 @@ static async Task SendAsync(ClientFormSender clientFormSender, Guid guid) return send.httpStatus; } - static async Task StartEndpoint() + static async Task StartEndpoint() { var configuration = await EndpointCreator.Create(nameof(HttpPassthroughDedupTests)); - return await Endpoint.Start(configuration); + var builder = Host.CreateApplicationBuilder(); + builder.Services.AddNServiceBusEndpoint(configuration); + var host = builder.Build(); + await host.StartAsync(); + return host; } static Task AmendMessage(HttpContext context, PassthroughMessage message) => diff --git a/src/SqlServer.Native.Tests/HttpPassthrough/IntegrationTest/HttpPassthroughIntegrationTests.cs b/src/SqlServer.Native.Tests/HttpPassthrough/IntegrationTest/HttpPassthroughIntegrationTests.cs index 73183e13..2e49cedb 100644 --- a/src/SqlServer.Native.Tests/HttpPassthrough/IntegrationTest/HttpPassthroughIntegrationTests.cs +++ b/src/SqlServer.Native.Tests/HttpPassthrough/IntegrationTest/HttpPassthroughIntegrationTests.cs @@ -1,4 +1,4 @@ -#if DEBUG +#if DEBUG using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -23,7 +23,7 @@ public async Task Integration() } var resetEvent = new ManualResetEvent(false); - var endpoint = await StartEndpoint(resetEvent); + var host = await StartEndpoint(resetEvent); await SubmitMultipartForm(); @@ -32,7 +32,7 @@ public async Task Integration() throw new("OutgoingMessage not received"); } - await endpoint.Stop(); + await host.StopAsync(); } static async Task SubmitMultipartForm() @@ -79,13 +79,17 @@ await clientFormSender.Send( }); } - static async Task StartEndpoint(ManualResetEvent resetEvent) + static async Task StartEndpoint(ManualResetEvent resetEvent) { var configuration = await EndpointCreator.Create(nameof(HttpPassthroughIntegrationTests)); var attachments = configuration.EnableAttachments(Connection.ConnectionString, TimeToKeep.Default); - configuration.RegisterComponents(_ => _.AddSingleton(resetEvent)); attachments.UseTransportConnectivity(); - return await Endpoint.Start(configuration); + var builder = Host.CreateApplicationBuilder(); + builder.Services.AddSingleton(resetEvent); + builder.Services.AddNServiceBusEndpoint(configuration); + var host = builder.Build(); + await host.StartAsync(); + return host; } static Task
AmendMessage(HttpContext context, PassthroughMessage message) => diff --git a/src/SqlServer.Native.Tests/MainQ/Incoming/ConsumerIntegrationTests.cs b/src/SqlServer.Native.Tests/MainQ/Incoming/ConsumerIntegrationTests.cs index 841b60c2..72f6d9c2 100644 --- a/src/SqlServer.Native.Tests/MainQ/Incoming/ConsumerIntegrationTests.cs +++ b/src/SqlServer.Native.Tests/MainQ/Incoming/ConsumerIntegrationTests.cs @@ -1,4 +1,4 @@ -public class ConsumerIntegrationTests : +public class ConsumerIntegrationTests : TestBase { static string table = "IntegrationConsumer_Consumer"; @@ -11,18 +11,23 @@ public async Task Run() await manager.Create(); var configuration = await EndpointCreator.Create("IntegrationConsumer"); configuration.SendOnly(); - var endpoint = await Endpoint.Start(configuration); - await SendStartMessage(endpoint); + var builder = Host.CreateApplicationBuilder(); + builder.Services.AddNServiceBusEndpoint(configuration); + var host = builder.Build(); + await host.StartAsync(); + var session = host.Services.GetRequiredService(); + await SendStartMessage(session); var consumer = new QueueManager(table, SqlConnection); await using var message = await consumer.Consume(); await Assert.That(message).IsNotNull(); + await host.StopAsync(); } - static Task SendStartMessage(IEndpointInstance endpoint) + static Task SendStartMessage(IMessageSession session) { var sendOptions = new SendOptions(); sendOptions.SetDestination(table); - return endpoint.Send(new SendMessage(), sendOptions); + return session.Send(new SendMessage(), sendOptions); } class SendMessage : diff --git a/src/SqlServer.Native.Tests/MainQ/Outgoing/SendIntegration.cs b/src/SqlServer.Native.Tests/MainQ/Outgoing/SendIntegration.cs index b14c690d..c2dd0a17 100644 --- a/src/SqlServer.Native.Tests/MainQ/Outgoing/SendIntegration.cs +++ b/src/SqlServer.Native.Tests/MainQ/Outgoing/SendIntegration.cs @@ -1,4 +1,4 @@ -using Headers = NServiceBus.Transport.SqlServerNative.Headers; +using Headers = NServiceBus.Transport.SqlServerNative.Headers; public class SendIntegration : TestBase @@ -8,11 +8,14 @@ public async Task Run() { var resetEvent = new ManualResetEvent(false); var configuration = await EndpointCreator.Create("IntegrationSend"); - configuration.RegisterComponents(_ => _.AddSingleton(resetEvent)); - var endpoint = await Endpoint.Start(configuration); + var builder = Host.CreateApplicationBuilder(); + builder.Services.AddNServiceBusEndpoint(configuration); + builder.Services.AddSingleton(resetEvent); + var host = builder.Build(); + await host.StartAsync(); await SendStartMessage(); resetEvent.WaitOne(); - await endpoint.Stop(); + await host.StopAsync(); } Task SendStartMessage() diff --git a/src/SqlServer.Native.Tests/QueueCreatorIntegration.cs b/src/SqlServer.Native.Tests/QueueCreatorIntegration.cs index fe9e7cbf..c4924a77 100644 --- a/src/SqlServer.Native.Tests/QueueCreatorIntegration.cs +++ b/src/SqlServer.Native.Tests/QueueCreatorIntegration.cs @@ -1,22 +1,26 @@ -public class QueueCreatorIntegration +public class QueueCreatorIntegration { [Test] public async Task Run() { var resetEvent = new ManualResetEvent(false); var configuration = await EndpointCreator.Create("IntegrationSend"); - configuration.RegisterComponents(_ => _.AddSingleton(resetEvent)); - var endpoint = await Endpoint.Start(configuration); - await SendStartMessage(endpoint); + var builder = Host.CreateApplicationBuilder(); + builder.Services.AddNServiceBusEndpoint(configuration); + builder.Services.AddSingleton(resetEvent); + var host = builder.Build(); + await host.StartAsync(); + var session = host.Services.GetRequiredService(); + await SendStartMessage(session); resetEvent.WaitOne(); - await endpoint.Stop(); + await host.StopAsync(); } - static Task SendStartMessage(IEndpointInstance endpoint) + static Task SendStartMessage(IMessageSession session) { var sendOptions = new SendOptions(); sendOptions.RouteToThisEndpoint(); - return endpoint.Send(new SendMessage(), sendOptions); + return session.Send(new SendMessage(), sendOptions); } class SendHandler(ManualResetEvent @event) :