将类型绑定到 Webjob SDK 触发器

Binding a type to Webjob SDK trigger

我正在使用 Webjob SDK 为 azure 服务总线提供服务。

它工作正常,现在我想开始参数化它的输入。

我一直在做:

public static void ProcessTopicStatusMessage([ServiceBusTrigger("%topic%", "%subname%")] BrokeredMessage message,
    TextWriter logger)

现在我还想添加一个额外的参数:端点。像这样:

public static void ProcessTopicStatusMessage([ServiceBusTrigger("%topic%", "%sub%")] BrokeredMessage message, Uri endPoint,
    TextWriter logger)

我认为可以像这样将 URI 类型绑定到配置:

config.BindingFactory.BindToInput<ServiceBusAttribute,Uri>(typeof(Uri), new Uri(myURI));

但是好像不行。 这甚至可能吗,还是我必须制作自己的自定义触发器?

正如您提到的,您可以声明一个静态字段来存储您的 uri,或者您可以使用 DI 容器注入它。 JobHostConfiguration 有一个 JobActivator 允许你使用 DI。

我在这里使用 SimpleInjector(nuget) 创建自定义作业激活器。

public class SimpleInjectorJobActivator : IJobActivator
{
    private readonly Container _container;

    public SimpleInjectorJobActivator(Container container)
    {
        _container = container;
    }

    public T CreateInstance<T>()
    {
        return (T)_container.GetInstance(typeof(T));
    }
}

现在您需要创建一个 class 来封装您的函数触发器:

public class TopicMessageProcessor
{
    private readonly Uri _myUry;

    public TopicMessageProcessor(Uri myUry)
    {
        _myUry = myUry;
    }

    public void ProcessTopicStatusMessage([ServiceBusTrigger("%topic%", "%sub%")] BrokeredMessage message,
        TextWriter logger)
    {
        // _myUry is accessible here
    }
}

在你的main函数中,你需要配置DI容器:

static void Main()
{
    ...
    // get the uri from the config database
    Uri myUry = ...
    var container = new Container();
    container.Register(() => new TopicMessageProcessor(myUry));
    container.Verify();

    var config = new JobHostConfiguration
    {
        JobActivator = new SimpleInjectorJobActivator(container)
    };

    ...    
}

请注意,这是一个非常简单的示例。如果有帮助,请告诉我。