问题在于,Azure WebJobs SDK仅支持将公共静态方法作为作业入口点,这意味着无法实现构造函数/属性注入。
我在WebJobs SDK官方文档/资源中找不到有关此主题的任何信息。我遇到的唯一的解决方案是基于对这个职位描述的服务定位器(反)模式在这里。
对于基于Azure WebJobs SDK的项目,有没有使用“适当的”依赖项注入的好方法?
Azure WebJobs SDK现在支持实例方法。将此与自定义IJobActivator结合使用,可以使用DI。
首先,创建自定义的IJobActivator,它可以使用您喜欢的DI容器解析作业类型:
public class MyActivator : IJobActivator { private readonly IUnityContainer _container; public MyActivator(IUnityContainer container) { _container = container; } public T CreateInstance<T>() { return _container.Resolve<T>(); } }
您需要使用自定义JobHostConfiguration注册此类:
var config = new JobHostConfiguration { JobActivator = new MyActivator(myContainer) }; var host = new JobHost(config);
然后,您可以为工作使用带有实例方法的简单类(这里我使用Unity的构造函数注入功能):
public class MyFunctions { private readonly ISomeDependency _dependency; public MyFunctions(ISomeDependency dependency) { _dependency = dependency; } public Task DoStuffAsync([QueueTrigger("queue")] string message) { Console.WriteLine("Injected dependency: {0}", _dependency); return Task.FromResult(true); } }