将类型绑定到Webjob SDK触发器

时间:2017-06-15 12:25:47

标签: c# azure azureservicebus azure-webjobssdk azure-servicebus-topics

我正在使用Webjob SDK来提供天蓝色的服务总线。

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

我一直在做:

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

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

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

我认为通过将URI类型绑定到配置是可能的:

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

但它似乎不起作用。 这甚至是可能的,还是我必须制作自己的自定义触发器?

1 个答案:

答案 0 :(得分:1)

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

我在这里使用SimpleInjectornuget)来创建自定义作业激活器。

public class SimpleInjectorJobActivator : IJobActivator
{
    private readonly Container _container;

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

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

现在你需要创建一个封装你的函数触发器的类:

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)
    };

    ...    
}

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