Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions src/ManualTests.HostV4/Program.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Extensions.Hosting;
using NServiceBus;

[assembly: NServiceBusTriggerFunction("FunctionsTestEndpoint2", TriggerFunctionName = "MyFunctionName")]

var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.UseNServiceBus(c =>
{
c.Routing.RouteToEndpoint(typeof(TriggerMessage), "FunctionsTestEndpoint2");
c.AdvancedConfiguration.EnableInstallers();
})
.Build();
var builder = FunctionsApplication.CreateBuilder(args);

host.Run();
builder.AddNServiceBus(c =>
{
c.Routing.RouteToEndpoint(typeof(TriggerMessage), "FunctionsTestEndpoint2");
c.AdvancedConfiguration.EnableInstallers();
});

var host = builder.Build();

await host.RunAsync();
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public void Approve()
{
var publicApi = typeof(ServiceBusTriggeredEndpointConfiguration).Assembly.GeneratePublicApi(new ApiGeneratorOptions
{
ExcludeAttributes = new[] { "System.Runtime.Versioning.TargetFrameworkAttribute", "System.Reflection.AssemblyMetadataAttribute" }
ExcludeAttributes = ["System.Runtime.Versioning.TargetFrameworkAttribute", "System.Reflection.AssemblyMetadataAttribute"]
});
Approver.Verify(publicApi);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,49 @@
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.AzureFunctions.Worker.ServiceBus.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5")]
namespace NServiceBus
{
public static class FunctionsHostApplicationBuilderExtensions
{
public static Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(this Microsoft.Extensions.Hosting.IHostApplicationBuilder builder, System.Action<NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory = null) { }
public static Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(this Microsoft.Extensions.Hosting.IHostApplicationBuilder builder, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
public static Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(this Microsoft.Extensions.Hosting.IHostApplicationBuilder builder, string endpointName, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
public static Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(this Microsoft.Extensions.Hosting.IHostApplicationBuilder builder, string endpointName, string connectionString, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
public static Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(this Microsoft.Extensions.Hosting.IHostApplicationBuilder builder, string endpointName, string connectionString = null, System.Action<NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory = null) { }
public sealed class <G>$605D8CCF64349EA050C790D67C500BD9
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: I know this is not part of your implementation, but it is a bummer that it adds a hashed value here.

Copy link
Member Author

@bording bording Sep 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What you're seeing there is that PublicApiGenerator doesn't yet have support for displaying C# 14 extensions in a more "expected" way, so it's showing the underlying implementation details of how the new extensions were implemented in the compiler so that the resulting assembly is still compatible with older compilers.

{
[System.Runtime.CompilerServices.ExtensionMarker("<M>$6A88ABDA462C17BA6C9142C2A21FF572")]
public Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(System.Action<NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory = null) { }
[System.Runtime.CompilerServices.ExtensionMarker("<M>$6A88ABDA462C17BA6C9142C2A21FF572")]
public Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
[System.Runtime.CompilerServices.ExtensionMarker("<M>$6A88ABDA462C17BA6C9142C2A21FF572")]
public Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(string endpointName, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
[System.Runtime.CompilerServices.ExtensionMarker("<M>$6A88ABDA462C17BA6C9142C2A21FF572")]
public Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(string endpointName, string connectionString, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
[System.Runtime.CompilerServices.ExtensionMarker("<M>$6A88ABDA462C17BA6C9142C2A21FF572")]
public Microsoft.Extensions.Hosting.IHostApplicationBuilder AddNServiceBus(string endpointName, string connectionString = null, System.Action<NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory = null) { }
public static class <M>$6A88ABDA462C17BA6C9142C2A21FF572 { }
}
}
public static class FunctionsHostBuilderExtensions
{
public static Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action<NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory = null) { }
public static Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
public static Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, string endpointName, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
public static Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, string endpointName, string connectionString, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
public static Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, string endpointName, string connectionString = null, System.Action<NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory = null) { }
public sealed class <G>$1979BC88EA66E945160B6D91D71A3DB8
{
[System.Runtime.CompilerServices.ExtensionMarker("<M>$DE83CB30C746F0AB064A705A0C00CB75")]
public Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(System.Action<NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory = null) { }
[System.Runtime.CompilerServices.ExtensionMarker("<M>$DE83CB30C746F0AB064A705A0C00CB75")]
public Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
[System.Runtime.CompilerServices.ExtensionMarker("<M>$DE83CB30C746F0AB064A705A0C00CB75")]
public Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(string endpointName, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
[System.Runtime.CompilerServices.ExtensionMarker("<M>$DE83CB30C746F0AB064A705A0C00CB75")]
public Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(string endpointName, string connectionString, System.Action<Microsoft.Extensions.Configuration.IConfiguration, NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory) { }
[System.Runtime.CompilerServices.ExtensionMarker("<M>$DE83CB30C746F0AB064A705A0C00CB75")]
public Microsoft.Extensions.Hosting.IHostBuilder UseNServiceBus(string endpointName, string connectionString = null, System.Action<NServiceBus.ServiceBusTriggeredEndpointConfiguration> configurationFactory = null) { }
public static class <M>$DE83CB30C746F0AB064A705A0C00CB75 { }
}
}
public interface IFunctionEndpoint
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public Task<ComponentRunner> CreateRunner(RunDescriptor runDescriptor) =>
GetType()));

public Action<ServiceBusTriggeredEndpointConfiguration> CustomizeConfiguration { private get; init; } = _ => { };
public Action<IHostBuilder> CustomizeHostBuilder { private get; init; } = _ => { };
public Action<IHostApplicationBuilder> CustomizeHostBuilder { private get; init; } = _ => { };

public PublisherMetadata PublisherMetadata { get; } = new PublisherMetadata();

Expand All @@ -51,7 +51,7 @@ public void AddTestMessage(object body, IDictionary<string, object> userProperti
class FunctionRunner(
IList<TestMessage> messages,
Action<ServiceBusTriggeredEndpointConfiguration> configurationCustomization,
Action<IHostBuilder> hostBuilderCustomization,
Action<IHostApplicationBuilder> hostBuilderCustomization,
Func<IFunctionEndpoint, FunctionContext, Task> onStart,
ScenarioContext scenarioContext,
PublisherMetadata publisherMetadata,
Expand All @@ -62,16 +62,14 @@ class FunctionRunner(

public override async Task Start(CancellationToken cancellationToken = default)
{
var hostBuilder = Host.CreateDefaultBuilder();
_ = hostBuilder.ConfigureServices(services =>
{
// TODO Think about using a real logger or the NServiceBus.Testing logging infrastructure?
services.AddSingleton<ILoggerFactory>(new TestLoggingFactory());
});
var builder = Host.CreateApplicationBuilder([]);

// TODO Think about using a real logger or the NServiceBus.Testing logging infrastructure?
builder.Services.AddSingleton<ILoggerFactory>(new TestLoggingFactory());

hostBuilderCustomization(hostBuilder);
hostBuilderCustomization(builder);

hostBuilder.UseNServiceBus(Name, (configuration, triggerConfiguration) =>
builder.AddNServiceBus(Name, (configuration, triggerConfiguration) =>
{
var endpointConfiguration = triggerConfiguration.AdvancedConfiguration;

Expand Down Expand Up @@ -118,7 +116,7 @@ public override async Task Start(CancellationToken cancellationToken = default)
configurationCustomization(triggerConfiguration);
});

host = hostBuilder.Build();
host = builder.Build();
await host.StartAsync(cancellationToken);

endpoint = host.Services.GetRequiredService<IFunctionEndpoint>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,16 @@ class PublishingFunction : FunctionEndpointComponent
public PublishingFunction()
{
PublisherMetadata.RegisterPublisherFor<MyEvent>(typeof(PublishingFunction));
CustomizeHostBuilder = hostBuilder => hostBuilder.ConfigureHostConfiguration(config =>
CustomizeHostBuilder = builder =>
{
var customSettings = new Dictionary<string, string>
{
{ "AzureServiceBus:MigrationTopologyOptions:TopicToPublishTo", "bundle-1" },
{ "AzureServiceBus:MigrationTopologyOptions:TopicToSubscribeOn", "bundle-1" },
{ $"AzureServiceBus:MigrationTopologyOptions:PublishedEventToTopicsMap:{typeof(MyEvent).FullName}", $"{typeof(MyEvent).ToTopicName()}" },
};
_ = config.AddInMemoryCollection(customSettings);
});
_ = builder.Configuration.AddInMemoryCollection(customSettings);
};
AddTestMessage(new TriggerMessage());
}

Expand Down
Loading
Loading