1

我正在使用 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));

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

4

1 回答 1

1

正如您所提到的,您可以声明一个静态字段来存储您的 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));
    }
}

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

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

    ...    
}

请注意,这是一个非常简单的示例。让我知道它是否有帮助。

于 2017-06-20T20:41:07.207 回答