在此示例中如何使用DI?

时间:2019-07-27 18:37:27

标签: azure asp.net-core dependency-injection azure-webjobssdk

我遵循了这个示例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:对象引用未设置为对象的实例。

1 个答案:

答案 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());

这应该允许运行时使用参数化的构造函数。