在 ServiceBusTrigger 中引用主题名称的环境变量

Referencing environment variable for topic name in ServiceBusTrigger

我想将项目添加到服务总线主题,然后取消 'Live' 订阅并发送到实时站点,然后取消 'Development' 订阅并发送到开发站点。

[FunctionName("AddFoo")]
public static async Task AddFooAsync(
    [ServiceBusTrigger("topic-foo", "Live")]QueueItem item,
    TraceWriter log)
{
    var endpoint = ConfigurationManager.AppSettings["EndPoint"];
    var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Add("PublisherKey", foo.PublisherKey);
    var foos = new HttpFooStore(httpClient, endpoint);

    try
    {
        await foos.AddAsync(item.Value);
    }
    catch (BadRequestException)
    {
        log.Warning("Malformed request was rejected by XXX", item.PublisherName);
        return;
    }
    catch (AuthorizationException)
    {
        log.Warning("Unauthorized request was rejected by XXX", item.PublisherName);
        return;
    }
    catch (ResourceNotFoundException)
    {
        log.Warning("Request for unknown tracker was rejected by XXX", item.PublisherName);
        return;
    }
    catch (Exception e)
    {
        log.Error("Request to XXX was unsuccessful", e, item.PublisherName);
        throw e;
    }
}

功能的实现完全一样,唯一不同的是订阅的名称,以及使用的端点。不幸的是,订阅名称是注释的一部分,因此它必须是常量。有什么方法可以在不必复制所有代码的情况下获得所需的效果?

编辑

澄清一下,我想创建两个单独的部署 - 一个用于实时,一个用于开发。对于每个部署,我都会更新环境设置,这将确定函数绑定到哪个订阅。

您不能让一个函数由两个服务总线主题(开发与实时)触发,但您可以将函数的主体移动到可以从两个函数调用的辅助方法中。

您可以用百分号包围它们来引用环境变量:

ServiceBusTrigger("%myTopic%", "%mySubscription%")

其中 myTopicmySubscription 是应用程序设置中的环境变量。