internal class RabbitMQTriggerAttributeBindingProvider()

in extension/WebJobs.Extensions.RabbitMQ/Trigger/RabbitMQTriggerAttributeBindingProvider.cs [15:55]


internal class RabbitMQTriggerAttributeBindingProvider(
    INameResolver nameResolver,
    RabbitMQExtensionConfigProvider provider,
    ILogger logger,
    IOptions<RabbitMQOptions> options,
    IConfiguration configuration,
    IDrainModeManager drainModeManager) : ITriggerBindingProvider
{
    private readonly INameResolver nameResolver = nameResolver ?? throw new ArgumentNullException(nameof(nameResolver));
    private readonly RabbitMQExtensionConfigProvider provider = provider ?? throw new ArgumentNullException(nameof(provider));
    private readonly ILogger logger = logger ?? throw new ArgumentNullException(nameof(logger));
    private readonly IOptions<RabbitMQOptions> options = options;
    private readonly IConfiguration configuration = configuration;
    private readonly IDrainModeManager drainModeManager = drainModeManager;

    public Task<ITriggerBinding> TryCreateAsync(TriggerBindingProviderContext context)
    {
        _ = context ?? throw new ArgumentNullException(nameof(context));

        ParameterInfo parameter = context.Parameter;
        RabbitMQTriggerAttribute attribute = parameter.GetCustomAttribute<RabbitMQTriggerAttribute>(inherit: false);

        if (attribute == null)
        {
            return Task.FromResult<ITriggerBinding>(null);
        }

        string connectionString = Utility.ResolveConnectionString(attribute.ConnectionStringSetting, this.options.Value.ConnectionString, this.configuration);
        string queueName = this.Resolve(attribute.QueueName) ?? throw new InvalidOperationException("RabbitMQ queue name is missing");
        bool disableCertificateValidation = attribute.DisableCertificateValidation || this.options.Value.DisableCertificateValidation;

        IRabbitMQService service = this.provider.GetService(connectionString, queueName, disableCertificateValidation);

        return Task.FromResult<ITriggerBinding>(new RabbitMQTriggerBinding(service, queueName, this.logger, parameter.ParameterType, this.options.Value.PrefetchCount, this.drainModeManager));
    }

    private string Resolve(string name)
    {
        return this.nameResolver.ResolveWholeString(name) ?? name;
    }
}