我正在使用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));
但它似乎不起作用。 这甚至是可能的,还是我必须制作自己的自定义触发器?
答案 0 :(得分: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)
};
...
}
请注意,这是一个非常简单的例子。如果有帮助,请告诉我。