将类型绑定到 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)
};
...
}
请注意,这是一个非常简单的示例。如果有帮助,请告诉我。
我正在使用 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)
};
...
}
请注意,这是一个非常简单的示例。如果有帮助,请告诉我。