我遵循了这个示例https://docs.microsoft.com/pt-br/azure/app-service/webjobs-sdk-get-started,它工作正常。我要做的是使函数类中的所有方法中都可以使用连接字符串(强类型)。我的连接字符串对象:
namespace MyApp.Domain
{
public class Secrets
{
public class ConnectionStrings
{
public string SqlServer {get; set;}
public string Storage {get; set;}
public string SendGrid {get; set;}
public string AzureWebJobsDashboard { get; set; }
public string AzureWebJobsStorage {get; set;}
}
}
}
在Web项目中,我使用了它(效果很好):
services.Configure<Secrets.ConnectionStrings>(Configuration.GetSection("CUSTOMCONNSTR_ConnectionStrings"));
,在类的构造函数中,我使用:
public class EmailController: ControllerBase
{
private readonly MyEmail _myEmail;
public EmailController(MyEmail MyEmail)
{
_myEmail = MyEmail;
}
[HttpGet]
public async Task<ActionResult<string>> SendEmail()
{
try
{
...
return await _myEmail.SendMailMI3D(myMsg);
}
catch (System.Exception ex)
{
return ex.Message + " - " + ex.StackTrace;
}
}
[HttpGet("sendgrid")]
public string GetSendGrid(long id)
{
return _myEmail.SendGridConnStr();
}
}
但是这种方法不适用于webjobs(控制台应用程序)。
我试图在Function的构造函数中插入一个简单的Console.WriteLine,但是它不能正常工作。所以我认为这是问题所在:未调用函数的构造函数。因此,当我在队列中插入一条消息时,会收到以下与DI连接字符串有关的错误消息:
Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行函数时发生异常:Functions.ProcessQueueMessage ---> System.NullReferenceException:对象引用未设置为对象的实例。
有人可以帮助我吗?非常感谢。
public Functions(IOptions<Secrets.ConnectionStrings> ConnectionStrings)
{
_connectionStrings = ConnectionStrings;
Console.WriteLine("Simple line");
Console.WriteLine($"Functions constructor: ${_connectionStrings.Value.SendGrid}");
}
Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行函数时发生异常:Functions.ProcessQueueMessage ---> System.NullReferenceException:对象引用未设置为对象的实例。
答案 0 :(得分:0)
依赖注入在WebJobs中可用,但是您确实需要对create an IJobActivator采取额外的步骤来定义注入。
namespace NetCoreWebJob.WebJob
{
public class JobActivator : IJobActivator
{
private readonly IServiceProvider services;
public JobActivator(IServiceProvider services)
{
this.services = services;
}
public T CreateInstance<T>()
{
return services.GetService<T>();
}
}
}
在Main()
内
var config = new JobHostConfiguration();
config.JobActivator = new JobActivator(services.BuildServiceProvider());
这应该允许运行时使用参数化的构造函数。