diff --git a/samples/multi-tenant/ravendb/Core_10/MultiTenant.sln b/samples/multi-tenant/ravendb/Raven_10/MultiTenant.sln similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/MultiTenant.sln rename to samples/multi-tenant/ravendb/Raven_10/MultiTenant.sln diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/Order.cs b/samples/multi-tenant/ravendb/Raven_10/Receiver/Order.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Receiver/Order.cs rename to samples/multi-tenant/ravendb/Raven_10/Receiver/Order.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/OrderLifecycleSaga.cs b/samples/multi-tenant/ravendb/Raven_10/Receiver/OrderLifecycleSaga.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Receiver/OrderLifecycleSaga.cs rename to samples/multi-tenant/ravendb/Raven_10/Receiver/OrderLifecycleSaga.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/OrderLifecycleSagaData.cs b/samples/multi-tenant/ravendb/Raven_10/Receiver/OrderLifecycleSagaData.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Receiver/OrderLifecycleSagaData.cs rename to samples/multi-tenant/ravendb/Raven_10/Receiver/OrderLifecycleSagaData.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/OrderSubmittedHandler.cs b/samples/multi-tenant/ravendb/Raven_10/Receiver/OrderSubmittedHandler.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Receiver/OrderSubmittedHandler.cs rename to samples/multi-tenant/ravendb/Raven_10/Receiver/OrderSubmittedHandler.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/OrderTimeout.cs b/samples/multi-tenant/ravendb/Raven_10/Receiver/OrderTimeout.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Receiver/OrderTimeout.cs rename to samples/multi-tenant/ravendb/Raven_10/Receiver/OrderTimeout.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/Program.cs b/samples/multi-tenant/ravendb/Raven_10/Receiver/Program.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Receiver/Program.cs rename to samples/multi-tenant/ravendb/Raven_10/Receiver/Program.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/PropagateTenantIdBehavior.cs b/samples/multi-tenant/ravendb/Raven_10/Receiver/PropagateTenantIdBehavior.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Receiver/PropagateTenantIdBehavior.cs rename to samples/multi-tenant/ravendb/Raven_10/Receiver/PropagateTenantIdBehavior.cs diff --git a/samples/multi-tenant/ravendb/Raven_10/Receiver/Receiver.csproj b/samples/multi-tenant/ravendb/Raven_10/Receiver/Receiver.csproj new file mode 100644 index 00000000000..b4ee7c10ea3 --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_10/Receiver/Receiver.csproj @@ -0,0 +1,16 @@ + + + net9.0;net8.0 + Exe + 12.0 + enable + + + + + + + + + + \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/StoreTenantIdBehavior.cs b/samples/multi-tenant/ravendb/Raven_10/Receiver/StoreTenantIdBehavior.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Receiver/StoreTenantIdBehavior.cs rename to samples/multi-tenant/ravendb/Raven_10/Receiver/StoreTenantIdBehavior.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Sender/OrderAcceptedHandler.cs b/samples/multi-tenant/ravendb/Raven_10/Sender/OrderAcceptedHandler.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Sender/OrderAcceptedHandler.cs rename to samples/multi-tenant/ravendb/Raven_10/Sender/OrderAcceptedHandler.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Sender/Program.cs b/samples/multi-tenant/ravendb/Raven_10/Sender/Program.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Sender/Program.cs rename to samples/multi-tenant/ravendb/Raven_10/Sender/Program.cs diff --git a/samples/multi-tenant/ravendb/Core_9/Sender/Sender.csproj b/samples/multi-tenant/ravendb/Raven_10/Sender/Sender.csproj similarity index 86% rename from samples/multi-tenant/ravendb/Core_9/Sender/Sender.csproj rename to samples/multi-tenant/ravendb/Raven_10/Sender/Sender.csproj index ea20de6eca3..637b111be9a 100644 --- a/samples/multi-tenant/ravendb/Core_9/Sender/Sender.csproj +++ b/samples/multi-tenant/ravendb/Raven_10/Sender/Sender.csproj @@ -3,9 +3,10 @@ net9.0;net8.0 Exe 12.0 + enable - + diff --git a/samples/multi-tenant/ravendb/Core_10/Shared/OrderAccepted.cs b/samples/multi-tenant/ravendb/Raven_10/Shared/OrderAccepted.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Shared/OrderAccepted.cs rename to samples/multi-tenant/ravendb/Raven_10/Shared/OrderAccepted.cs diff --git a/samples/multi-tenant/ravendb/Core_10/Shared/OrderSubmitted.cs b/samples/multi-tenant/ravendb/Raven_10/Shared/OrderSubmitted.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/Shared/OrderSubmitted.cs rename to samples/multi-tenant/ravendb/Raven_10/Shared/OrderSubmitted.cs diff --git a/samples/multi-tenant/ravendb/Core_9/Shared/Shared.csproj b/samples/multi-tenant/ravendb/Raven_10/Shared/Shared.csproj similarity index 85% rename from samples/multi-tenant/ravendb/Core_9/Shared/Shared.csproj rename to samples/multi-tenant/ravendb/Raven_10/Shared/Shared.csproj index 72aec1f4abf..94bc7f5c40c 100644 --- a/samples/multi-tenant/ravendb/Core_9/Shared/Shared.csproj +++ b/samples/multi-tenant/ravendb/Raven_10/Shared/Shared.csproj @@ -2,6 +2,7 @@ net9.0;net8.0 12.0 + enable diff --git a/samples/multi-tenant/ravendb/Core_8/MultiTenant.sln b/samples/multi-tenant/ravendb/Raven_11/MultiTenant.sln similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/MultiTenant.sln rename to samples/multi-tenant/ravendb/Raven_11/MultiTenant.sln diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/Order.cs b/samples/multi-tenant/ravendb/Raven_11/Receiver/Order.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/Order.cs rename to samples/multi-tenant/ravendb/Raven_11/Receiver/Order.cs diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/OrderLifecycleSaga.cs b/samples/multi-tenant/ravendb/Raven_11/Receiver/OrderLifecycleSaga.cs similarity index 88% rename from samples/multi-tenant/ravendb/Core_9/Receiver/OrderLifecycleSaga.cs rename to samples/multi-tenant/ravendb/Raven_11/Receiver/OrderLifecycleSaga.cs index 5f99fccbea9..bd78f35edbb 100644 --- a/samples/multi-tenant/ravendb/Core_9/Receiver/OrderLifecycleSaga.cs +++ b/samples/multi-tenant/ravendb/Raven_11/Receiver/OrderLifecycleSaga.cs @@ -1,7 +1,4 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using NServiceBus; +using Microsoft.Extensions.Logging; public class OrderLifecycleSaga(ILogger logger) : Saga, diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/OrderLifecycleSagaData.cs b/samples/multi-tenant/ravendb/Raven_11/Receiver/OrderLifecycleSagaData.cs similarity index 51% rename from samples/multi-tenant/ravendb/Core_9/Receiver/OrderLifecycleSagaData.cs rename to samples/multi-tenant/ravendb/Raven_11/Receiver/OrderLifecycleSagaData.cs index 4dd8c335f05..1270ac73c4c 100644 --- a/samples/multi-tenant/ravendb/Core_9/Receiver/OrderLifecycleSagaData.cs +++ b/samples/multi-tenant/ravendb/Raven_11/Receiver/OrderLifecycleSagaData.cs @@ -1,6 +1,4 @@ -using NServiceBus; - -public class OrderLifecycleSagaData : +public class OrderLifecycleSagaData : ContainSagaData { public string OrderId { get; set; } diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/OrderSubmittedHandler.cs b/samples/multi-tenant/ravendb/Raven_11/Receiver/OrderSubmittedHandler.cs similarity index 94% rename from samples/multi-tenant/ravendb/Core_9/Receiver/OrderSubmittedHandler.cs rename to samples/multi-tenant/ravendb/Raven_11/Receiver/OrderSubmittedHandler.cs index 6f32b4ea9ae..98b721188dd 100644 --- a/samples/multi-tenant/ravendb/Core_9/Receiver/OrderSubmittedHandler.cs +++ b/samples/multi-tenant/ravendb/Raven_11/Receiver/OrderSubmittedHandler.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using NServiceBus; public class OrderSubmittedHandler(ILogger logger) : IHandleMessages diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/OrderTimeout.cs b/samples/multi-tenant/ravendb/Raven_11/Receiver/OrderTimeout.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/OrderTimeout.cs rename to samples/multi-tenant/ravendb/Raven_11/Receiver/OrderTimeout.cs diff --git a/samples/multi-tenant/ravendb/Raven_11/Receiver/Program.cs b/samples/multi-tenant/ravendb/Raven_11/Receiver/Program.cs new file mode 100644 index 00000000000..c7cfcb16b7e --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_11/Receiver/Program.cs @@ -0,0 +1,99 @@ +using Microsoft.Extensions.Hosting; +using Raven.Client.Documents; +using Raven.Client.Documents.Operations; +using Raven.Client.Exceptions; +using Raven.Client.Exceptions.Database; +using Raven.Client.ServerWide; +using Raven.Client.ServerWide.Operations; + +Console.Title = "Receiver"; +var builder = Host.CreateApplicationBuilder(args); + +var endpointConfiguration = new EndpointConfiguration("Samples.MultiTenant.Receiver"); + +using var documentStore = new DocumentStore +{ + Urls = new[] { "http://localhost:8080" }, + Database = "MultiTenantSamples", +}; + +documentStore.Initialize(); +await CreateDatabase(documentStore); +await CreateTenantDatabase(documentStore, "A"); +await CreateTenantDatabase(documentStore, "B"); + +var persistence = endpointConfiguration.UsePersistence(); +persistence.SetDefaultDocumentStore(documentStore); + +var transport = new LearningTransport +{ + TransportTransactionMode = TransportTransactionMode.ReceiveOnly +}; +endpointConfiguration.UseTransport(transport); +endpointConfiguration.UseSerialization(); + +var outbox = endpointConfiguration.EnableOutbox(); + +#region DetermineDatabase + +persistence.SetMessageToDatabaseMappingConvention(headers => +{ + return headers.TryGetValue("tenant_id", out var tenantId) + ? $"MultiTenantSamples-{tenantId}" + : "MultiTenantSamples"; +}); + +#endregion + +var pipeline = endpointConfiguration.Pipeline; + +pipeline.Register(new StoreTenantIdBehavior(), "Stores tenant ID in the session"); +pipeline.Register(new PropagateTenantIdBehavior(), "Propagates tenant ID to outgoing messages"); + +builder.UseNServiceBus(endpointConfiguration); +await builder.Build().RunAsync(); + +static async Task CreateDatabase(IDocumentStore documentStore) +{ + try + { + await documentStore.Maintenance.ForDatabase(documentStore.Database).SendAsync(new GetStatisticsOperation()); + } + catch (DatabaseDoesNotExistException) + { + try + { + await documentStore.Maintenance.Server.SendAsync(new CreateDatabaseOperation(new DatabaseRecord(documentStore.Database))); + } + catch (ConcurrencyException) + { + // This exception is thrown if the database already exists. + // We can safely ignore it, as our goal is simply to ensure it exists. + } + } +} + +static async Task CreateTenantDatabase(DocumentStore documentStore, string tenant) +{ + #region CreateDatabase + + var id = $"MultiTenantSamples-{tenant}"; + try + { + await documentStore.Maintenance.ForDatabase(id).SendAsync(new GetStatisticsOperation()); + } + catch (DatabaseDoesNotExistException) + { + try + { + await documentStore.Maintenance.Server.SendAsync(new CreateDatabaseOperation(new DatabaseRecord(id))); + } + catch (ConcurrencyException) + { + // This exception is thrown if the database already exists. + // We can safely ignore it, as our goal is simply to ensure it exists. + } + } + + #endregion +} \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/PropagateTenantIdBehavior.cs b/samples/multi-tenant/ravendb/Raven_11/Receiver/PropagateTenantIdBehavior.cs similarity index 89% rename from samples/multi-tenant/ravendb/Core_9/Receiver/PropagateTenantIdBehavior.cs rename to samples/multi-tenant/ravendb/Raven_11/Receiver/PropagateTenantIdBehavior.cs index a6b60e90903..4a45a36c6de 100644 --- a/samples/multi-tenant/ravendb/Core_9/Receiver/PropagateTenantIdBehavior.cs +++ b/samples/multi-tenant/ravendb/Raven_11/Receiver/PropagateTenantIdBehavior.cs @@ -1,5 +1,3 @@ -using System; -using System.Threading.Tasks; using NServiceBus.Pipeline; public class PropagateTenantIdBehavior : diff --git a/samples/multi-tenant/ravendb/Core_10/Receiver/Receiver.csproj b/samples/multi-tenant/ravendb/Raven_11/Receiver/Receiver.csproj similarity index 74% rename from samples/multi-tenant/ravendb/Core_10/Receiver/Receiver.csproj rename to samples/multi-tenant/ravendb/Raven_11/Receiver/Receiver.csproj index cc25cfe953a..f9aad89b44a 100644 --- a/samples/multi-tenant/ravendb/Core_10/Receiver/Receiver.csproj +++ b/samples/multi-tenant/ravendb/Raven_11/Receiver/Receiver.csproj @@ -6,9 +6,9 @@ enable - - - + + + diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/StoreTenantIdBehavior.cs b/samples/multi-tenant/ravendb/Raven_11/Receiver/StoreTenantIdBehavior.cs similarity index 91% rename from samples/multi-tenant/ravendb/Core_9/Receiver/StoreTenantIdBehavior.cs rename to samples/multi-tenant/ravendb/Raven_11/Receiver/StoreTenantIdBehavior.cs index 812087502ab..7286124b72d 100644 --- a/samples/multi-tenant/ravendb/Core_9/Receiver/StoreTenantIdBehavior.cs +++ b/samples/multi-tenant/ravendb/Raven_11/Receiver/StoreTenantIdBehavior.cs @@ -1,5 +1,3 @@ -using System; -using System.Threading.Tasks; using NServiceBus.Pipeline; public class StoreTenantIdBehavior : diff --git a/samples/multi-tenant/ravendb/Core_9/Sender/OrderAcceptedHandler.cs b/samples/multi-tenant/ravendb/Raven_11/Sender/OrderAcceptedHandler.cs similarity index 78% rename from samples/multi-tenant/ravendb/Core_9/Sender/OrderAcceptedHandler.cs rename to samples/multi-tenant/ravendb/Raven_11/Sender/OrderAcceptedHandler.cs index 657a0f35b9a..8973ada9264 100644 --- a/samples/multi-tenant/ravendb/Core_9/Sender/OrderAcceptedHandler.cs +++ b/samples/multi-tenant/ravendb/Raven_11/Sender/OrderAcceptedHandler.cs @@ -1,6 +1,5 @@ -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using NServiceBus; +using Microsoft.Extensions.Logging; + public class OrderAcceptedHandler(ILogger logger) : IHandleMessages { diff --git a/samples/multi-tenant/ravendb/Raven_11/Sender/Program.cs b/samples/multi-tenant/ravendb/Raven_11/Sender/Program.cs new file mode 100644 index 00000000000..9c88e1084e7 --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_11/Sender/Program.cs @@ -0,0 +1,65 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +Console.Title = "Sender"; + +// Configure the NServiceBus endpoint +var endpointConfiguration = new EndpointConfiguration("Samples.MultiTenant.Sender"); +endpointConfiguration.UseTransport(new LearningTransport()); +endpointConfiguration.UseSerialization(); +endpointConfiguration.EnableInstallers(); + +var builder = Host.CreateApplicationBuilder(args); +builder.UseNServiceBus(endpointConfiguration); + +var host = builder.Build(); + +await host.StartAsync(); + +// Get the required services +var messageSession = host.Services.GetRequiredService(); +// Register a cancellation token to gracefully handle application shutdown +var ct = host.Services.GetRequiredService().ApplicationStopping; + +Console.WriteLine("Press A or B to publish a message (A and B are tenant IDs). Press Ctrl+C to shut down."); + +// Wait for user input to publish messages +while (!ct.IsCancellationRequested) +{ + if (!Console.KeyAvailable) + { + // If no key is pressed, wait for a short time before checking again + await Task.Delay(100, CancellationToken.None); + continue; + } + + var input = Console.ReadKey(); + Console.WriteLine(); + + var inputKey = char.ToUpperInvariant(input.KeyChar); + if (inputKey is 'A' or 'B') + { + // Send a message to the specified tenant + var message = new OrderSubmitted + { + OrderId = GenerateOrderId(), + Value = GenerateOrderValue() + }; + + var options = new PublishOptions(); + options.SetHeader("tenant_id", inputKey.ToString()); + + await messageSession.Publish(message, options); + } + else + { + Console.WriteLine($"[{inputKey}] is not a valid tenant identifier."); + } +} + +// Wait for the host to stop gracefully +await host.StopAsync(); + +static string GenerateOrderId() => Guid.NewGuid().ToString("N")[..6].ToUpperInvariant(); + +static int GenerateOrderValue(int max = 100) => Random.Shared.Next(max); \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Core_10/Sender/Sender.csproj b/samples/multi-tenant/ravendb/Raven_11/Sender/Sender.csproj similarity index 94% rename from samples/multi-tenant/ravendb/Core_10/Sender/Sender.csproj rename to samples/multi-tenant/ravendb/Raven_11/Sender/Sender.csproj index ed89817f5b3..cddeed48115 100644 --- a/samples/multi-tenant/ravendb/Core_10/Sender/Sender.csproj +++ b/samples/multi-tenant/ravendb/Raven_11/Sender/Sender.csproj @@ -6,7 +6,7 @@ enable - + diff --git a/samples/multi-tenant/ravendb/Core_9/Shared/OrderAccepted.cs b/samples/multi-tenant/ravendb/Raven_11/Shared/OrderAccepted.cs similarity index 51% rename from samples/multi-tenant/ravendb/Core_9/Shared/OrderAccepted.cs rename to samples/multi-tenant/ravendb/Raven_11/Shared/OrderAccepted.cs index dff2e21282d..829a19e430f 100644 --- a/samples/multi-tenant/ravendb/Core_9/Shared/OrderAccepted.cs +++ b/samples/multi-tenant/ravendb/Raven_11/Shared/OrderAccepted.cs @@ -1,6 +1,4 @@ -using NServiceBus; - -public class OrderAccepted : +public class OrderAccepted : IMessage { public string OrderId { get; set; } diff --git a/samples/multi-tenant/ravendb/Core_9/Shared/OrderSubmitted.cs b/samples/multi-tenant/ravendb/Raven_11/Shared/OrderSubmitted.cs similarity index 63% rename from samples/multi-tenant/ravendb/Core_9/Shared/OrderSubmitted.cs rename to samples/multi-tenant/ravendb/Raven_11/Shared/OrderSubmitted.cs index ccf783adac6..d2ed02ba798 100644 --- a/samples/multi-tenant/ravendb/Core_9/Shared/OrderSubmitted.cs +++ b/samples/multi-tenant/ravendb/Raven_11/Shared/OrderSubmitted.cs @@ -1,6 +1,4 @@ -using NServiceBus; - -public class OrderSubmitted : +public class OrderSubmitted : IEvent { public string OrderId { get; set; } diff --git a/samples/multi-tenant/ravendb/Core_10/Shared/Shared.csproj b/samples/multi-tenant/ravendb/Raven_11/Shared/Shared.csproj similarity index 97% rename from samples/multi-tenant/ravendb/Core_10/Shared/Shared.csproj rename to samples/multi-tenant/ravendb/Raven_11/Shared/Shared.csproj index 09002cbbf5a..04e7e339b20 100644 --- a/samples/multi-tenant/ravendb/Core_10/Shared/Shared.csproj +++ b/samples/multi-tenant/ravendb/Raven_11/Shared/Shared.csproj @@ -5,6 +5,6 @@ enable - + \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Core_10/prerelease.txt b/samples/multi-tenant/ravendb/Raven_11/prerelease.txt similarity index 100% rename from samples/multi-tenant/ravendb/Core_10/prerelease.txt rename to samples/multi-tenant/ravendb/Raven_11/prerelease.txt diff --git a/samples/multi-tenant/ravendb/Core_9/MultiTenant.sln b/samples/multi-tenant/ravendb/Raven_8/MultiTenant.sln similarity index 100% rename from samples/multi-tenant/ravendb/Core_9/MultiTenant.sln rename to samples/multi-tenant/ravendb/Raven_8/MultiTenant.sln diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/Order.cs b/samples/multi-tenant/ravendb/Raven_8/Receiver/Order.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_9/Receiver/Order.cs rename to samples/multi-tenant/ravendb/Raven_8/Receiver/Order.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/OrderLifecycleSaga.cs b/samples/multi-tenant/ravendb/Raven_8/Receiver/OrderLifecycleSaga.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/OrderLifecycleSaga.cs rename to samples/multi-tenant/ravendb/Raven_8/Receiver/OrderLifecycleSaga.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/OrderLifecycleSagaData.cs b/samples/multi-tenant/ravendb/Raven_8/Receiver/OrderLifecycleSagaData.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/OrderLifecycleSagaData.cs rename to samples/multi-tenant/ravendb/Raven_8/Receiver/OrderLifecycleSagaData.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/OrderSubmittedHandler.cs b/samples/multi-tenant/ravendb/Raven_8/Receiver/OrderSubmittedHandler.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/OrderSubmittedHandler.cs rename to samples/multi-tenant/ravendb/Raven_8/Receiver/OrderSubmittedHandler.cs diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/OrderTimeout.cs b/samples/multi-tenant/ravendb/Raven_8/Receiver/OrderTimeout.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_9/Receiver/OrderTimeout.cs rename to samples/multi-tenant/ravendb/Raven_8/Receiver/OrderTimeout.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/Program.cs b/samples/multi-tenant/ravendb/Raven_8/Receiver/Program.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/Program.cs rename to samples/multi-tenant/ravendb/Raven_8/Receiver/Program.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/PropagateTenantIdBehavior.cs b/samples/multi-tenant/ravendb/Raven_8/Receiver/PropagateTenantIdBehavior.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/PropagateTenantIdBehavior.cs rename to samples/multi-tenant/ravendb/Raven_8/Receiver/PropagateTenantIdBehavior.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/Receiver.csproj b/samples/multi-tenant/ravendb/Raven_8/Receiver/Receiver.csproj similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/Receiver.csproj rename to samples/multi-tenant/ravendb/Raven_8/Receiver/Receiver.csproj diff --git a/samples/multi-tenant/ravendb/Core_8/Receiver/StoreTenantIdBehavior.cs b/samples/multi-tenant/ravendb/Raven_8/Receiver/StoreTenantIdBehavior.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Receiver/StoreTenantIdBehavior.cs rename to samples/multi-tenant/ravendb/Raven_8/Receiver/StoreTenantIdBehavior.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Sender/OrderAcceptedHandler.cs b/samples/multi-tenant/ravendb/Raven_8/Sender/OrderAcceptedHandler.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Sender/OrderAcceptedHandler.cs rename to samples/multi-tenant/ravendb/Raven_8/Sender/OrderAcceptedHandler.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Sender/Program.cs b/samples/multi-tenant/ravendb/Raven_8/Sender/Program.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Sender/Program.cs rename to samples/multi-tenant/ravendb/Raven_8/Sender/Program.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Sender/Sender.csproj b/samples/multi-tenant/ravendb/Raven_8/Sender/Sender.csproj similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Sender/Sender.csproj rename to samples/multi-tenant/ravendb/Raven_8/Sender/Sender.csproj diff --git a/samples/multi-tenant/ravendb/Core_8/Shared/OrderAccepted.cs b/samples/multi-tenant/ravendb/Raven_8/Shared/OrderAccepted.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Shared/OrderAccepted.cs rename to samples/multi-tenant/ravendb/Raven_8/Shared/OrderAccepted.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Shared/OrderSubmitted.cs b/samples/multi-tenant/ravendb/Raven_8/Shared/OrderSubmitted.cs similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Shared/OrderSubmitted.cs rename to samples/multi-tenant/ravendb/Raven_8/Shared/OrderSubmitted.cs diff --git a/samples/multi-tenant/ravendb/Core_8/Shared/Shared.csproj b/samples/multi-tenant/ravendb/Raven_8/Shared/Shared.csproj similarity index 100% rename from samples/multi-tenant/ravendb/Core_8/Shared/Shared.csproj rename to samples/multi-tenant/ravendb/Raven_8/Shared/Shared.csproj diff --git a/samples/multi-tenant/ravendb/Raven_9/MultiTenant.sln b/samples/multi-tenant/ravendb/Raven_9/MultiTenant.sln new file mode 100644 index 00000000000..c21ea5d3c6f --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/MultiTenant.sln @@ -0,0 +1,27 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29728.190 +MinimumVisualStudioVersion = 15.0.26730.12 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sender", "Sender\Sender.csproj", "{B58159EB-9EFD-443F-A80E-8C90B0AF1907}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Receiver", "Receiver\Receiver.csproj", "{1EEC6A8C-DB3C-4F20-93CE-5004BF16AD7F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{BF92D39E-42F6-44E9-8F7F-819993235621}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B58159EB-9EFD-443F-A80E-8C90B0AF1907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B58159EB-9EFD-443F-A80E-8C90B0AF1907}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1EEC6A8C-DB3C-4F20-93CE-5004BF16AD7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1EEC6A8C-DB3C-4F20-93CE-5004BF16AD7F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF92D39E-42F6-44E9-8F7F-819993235621}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF92D39E-42F6-44E9-8F7F-819993235621}.Debug|Any CPU.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/multi-tenant/ravendb/Raven_9/Receiver/Order.cs b/samples/multi-tenant/ravendb/Raven_9/Receiver/Order.cs new file mode 100644 index 00000000000..efad49178d8 --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/Order.cs @@ -0,0 +1,5 @@ +public class Order +{ + public string Id { get; set; } + public decimal Value { get; set; } +} \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderLifecycleSaga.cs b/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderLifecycleSaga.cs new file mode 100644 index 00000000000..bd78f35edbb --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderLifecycleSaga.cs @@ -0,0 +1,27 @@ +using Microsoft.Extensions.Logging; + +public class OrderLifecycleSaga(ILogger logger) : + Saga, + IAmStartedByMessages, + IHandleTimeouts +{ + + public async Task Handle(OrderSubmitted message, IMessageHandlerContext context) + { + Data.OrderId = message.OrderId; + + await RequestTimeout(context, TimeSpan.FromSeconds(5)); + } + + public Task Timeout(OrderTimeout state, IMessageHandlerContext context) + { + logger.LogInformation("Order {OrderId} has timed out", Data.OrderId); + return Task.CompletedTask; + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.MapSaga(saga => saga.OrderId) + .ToMessage(m => m.OrderId); + } +} \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderLifecycleSagaData.cs b/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderLifecycleSagaData.cs new file mode 100644 index 00000000000..1270ac73c4c --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderLifecycleSagaData.cs @@ -0,0 +1,5 @@ +public class OrderLifecycleSagaData : + ContainSagaData +{ + public string OrderId { get; set; } +} diff --git a/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderSubmittedHandler.cs b/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderSubmittedHandler.cs new file mode 100644 index 00000000000..98b721188dd --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderSubmittedHandler.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.Logging; + +public class OrderSubmittedHandler(ILogger logger) : + IHandleMessages +{ + public async Task Handle(OrderSubmitted message, IMessageHandlerContext context) + { + logger.LogInformation("Order {OrderId} worth {Value} submitted", message.OrderId, message.Value); + + var order = new Order + { + Id = message.OrderId, + Value = message.Value + }; + var session = context.SynchronizedStorageSession.RavenSession(); + + await session.StoreAsync(order, context.CancellationToken); + + var orderAccepted = new OrderAccepted + { + OrderId = message.OrderId, + }; + await context.Reply(orderAccepted); + } +} \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderTimeout.cs b/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderTimeout.cs new file mode 100644 index 00000000000..3fd2a7c9a01 --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/OrderTimeout.cs @@ -0,0 +1,3 @@ +public class OrderTimeout +{ +} \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/Program.cs b/samples/multi-tenant/ravendb/Raven_9/Receiver/Program.cs similarity index 96% rename from samples/multi-tenant/ravendb/Core_9/Receiver/Program.cs rename to samples/multi-tenant/ravendb/Raven_9/Receiver/Program.cs index 3f101875080..cea1f53f820 100644 --- a/samples/multi-tenant/ravendb/Core_9/Receiver/Program.cs +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/Program.cs @@ -1,7 +1,4 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.Hosting; -using NServiceBus; +using Microsoft.Extensions.Hosting; using Raven.Client.Documents; using Raven.Client.Documents.Operations; using Raven.Client.Exceptions; diff --git a/samples/multi-tenant/ravendb/Raven_9/Receiver/PropagateTenantIdBehavior.cs b/samples/multi-tenant/ravendb/Raven_9/Receiver/PropagateTenantIdBehavior.cs new file mode 100644 index 00000000000..4a45a36c6de --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/PropagateTenantIdBehavior.cs @@ -0,0 +1,16 @@ +using NServiceBus.Pipeline; + +public class PropagateTenantIdBehavior : + Behavior +{ + public override Task Invoke(IOutgoingLogicalMessageContext context, Func next) + { + if (context.Extensions.TryGet("TenantId", out string tenant)) + { + context.Headers["tenant_id"] = tenant; + } + return next(); + + } +} + diff --git a/samples/multi-tenant/ravendb/Core_9/Receiver/Receiver.csproj b/samples/multi-tenant/ravendb/Raven_9/Receiver/Receiver.csproj similarity index 89% rename from samples/multi-tenant/ravendb/Core_9/Receiver/Receiver.csproj rename to samples/multi-tenant/ravendb/Raven_9/Receiver/Receiver.csproj index 6cf744af537..25a60393298 100644 --- a/samples/multi-tenant/ravendb/Core_9/Receiver/Receiver.csproj +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/Receiver.csproj @@ -3,10 +3,11 @@ net9.0;net8.0 Exe 12.0 + enable - + diff --git a/samples/multi-tenant/ravendb/Raven_9/Receiver/StoreTenantIdBehavior.cs b/samples/multi-tenant/ravendb/Raven_9/Receiver/StoreTenantIdBehavior.cs new file mode 100644 index 00000000000..7286124b72d --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Receiver/StoreTenantIdBehavior.cs @@ -0,0 +1,16 @@ +using NServiceBus.Pipeline; + +public class StoreTenantIdBehavior : + Behavior +{ + public override Task Invoke(IIncomingLogicalMessageContext context, Func next) + { + if (context.MessageHeaders.TryGetValue("tenant_id", out var tenant)) + { + Console.WriteLine($"Setting tenent id to {tenant}"); + context.Extensions.Set("TenantId", tenant); + } + return next(); + + } +} diff --git a/samples/multi-tenant/ravendb/Raven_9/Sender/OrderAcceptedHandler.cs b/samples/multi-tenant/ravendb/Raven_9/Sender/OrderAcceptedHandler.cs new file mode 100644 index 00000000000..8973ada9264 --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Sender/OrderAcceptedHandler.cs @@ -0,0 +1,11 @@ +using Microsoft.Extensions.Logging; + +public class OrderAcceptedHandler(ILogger logger) : + IHandleMessages +{ + public Task Handle(OrderAccepted message, IMessageHandlerContext context) + { + logger.LogInformation("Order {OrderId} accepted.", message.OrderId); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Core_9/Sender/Program.cs b/samples/multi-tenant/ravendb/Raven_9/Sender/Program.cs similarity index 91% rename from samples/multi-tenant/ravendb/Core_9/Sender/Program.cs rename to samples/multi-tenant/ravendb/Raven_9/Sender/Program.cs index fd9d51177de..bd1c64594a4 100644 --- a/samples/multi-tenant/ravendb/Core_9/Sender/Program.cs +++ b/samples/multi-tenant/ravendb/Raven_9/Sender/Program.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using NServiceBus; Console.Title = "Sender"; diff --git a/samples/multi-tenant/ravendb/Raven_9/Sender/Sender.csproj b/samples/multi-tenant/ravendb/Raven_9/Sender/Sender.csproj new file mode 100644 index 00000000000..637b111be9a --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Sender/Sender.csproj @@ -0,0 +1,14 @@ + + + net9.0;net8.0 + Exe + 12.0 + enable + + + + + + + + \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Raven_9/Shared/OrderAccepted.cs b/samples/multi-tenant/ravendb/Raven_9/Shared/OrderAccepted.cs new file mode 100644 index 00000000000..829a19e430f --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Shared/OrderAccepted.cs @@ -0,0 +1,5 @@ +public class OrderAccepted : + IMessage +{ + public string OrderId { get; set; } +} \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Raven_9/Shared/OrderSubmitted.cs b/samples/multi-tenant/ravendb/Raven_9/Shared/OrderSubmitted.cs new file mode 100644 index 00000000000..d2ed02ba798 --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Shared/OrderSubmitted.cs @@ -0,0 +1,6 @@ +public class OrderSubmitted : + IEvent +{ + public string OrderId { get; set; } + public decimal Value { get; set; } +} \ No newline at end of file diff --git a/samples/multi-tenant/ravendb/Raven_9/Shared/Shared.csproj b/samples/multi-tenant/ravendb/Raven_9/Shared/Shared.csproj new file mode 100644 index 00000000000..94bc7f5c40c --- /dev/null +++ b/samples/multi-tenant/ravendb/Raven_9/Shared/Shared.csproj @@ -0,0 +1,10 @@ + + + net9.0;net8.0 + 12.0 + enable + + + + + \ No newline at end of file