Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心Web作业DI_C#_Asp.net Core_Dependency Injection_Azure Webjobs - Fatal编程技术网

C# ASP.NET核心Web作业DI

C# ASP.NET核心Web作业DI,c#,asp.net-core,dependency-injection,azure-webjobs,C#,Asp.net Core,Dependency Injection,Azure Webjobs,我想在我的WebJobs中使用DI,就像在WebApps中使用DI一样,但老实说,我不知道Functions.cs是如何调用的。如果在Functions.cs的构造函数中插入Console.WriteLine,则不会打印它 我怎样才能做到这一点 Program.cs class Program { static void Main(string[] args) { var builder = new HostBuilder(); builder.Co

我想在我的WebJobs中使用DI,就像在WebApps中使用DI一样,但老实说,我不知道Functions.cs是如何调用的。如果在Functions.cs的构造函数中插入Console.WriteLine,则不会打印它

我怎样才能做到这一点

Program.cs

class Program
  {
    static void Main(string[] args)
    {
      var builder = new HostBuilder();

      builder.ConfigureWebJobs(b =>
      {
        b.AddAzureStorageCoreServices();
        b.AddAzureStorage();
      });

      builder.ConfigureLogging((context, b) => {
        b.AddConsole();
      });

      builder.ConfigureServices((context, services) => {
        // Inject config
        services.Configure<Secrets.ConnectionStrings>(context.Configuration.GetSection("ConnectionStrings"));
        services.AddSingleton<Functions>();
        services.AddSingleton<MyEmail>();
        services.AddSingleton<IMyFunc, MyFunc>();

        services.BuildServiceProvider();
      });

      var host = builder.Build();

      using (host)
      {
        host.Run();
      }
    }
  }
类程序
{
静态void Main(字符串[]参数)
{
var builder=新主机生成器();
builder.ConfigureWebJobs(b=>
{
b、 AddAzureStorageCoreServices();
b、 AddAzureStorage();
});
builder.ConfigureLogging((上下文,b)=>{
b、 AddConsole();
});
builder.ConfigureServices((上下文,服务)=>{
//注入配置
services.Configure(context.Configuration.GetSection(“ConnectionString”);
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.BuildServiceProvider();
});
var host=builder.Build();
使用(主机)
{
host.Run();
}
}
}
函数.cs

public class Functions
  {
    private static IOptions<Secrets.ConnectionStrings> _myConnStr;
    private static MyEmail _myEmail;
    private static IMyFunc _myFunc;

    public Functions(IOptions<Secrets.ConnectionStrings> ConnectionString, MyEmail MyEmail, MyFunc MyFunc)
    {
      _myConnStr = ConnectionString;
      _myEmail = MyEmail;
      _myFunc = MyFunc;

      Console.WriteLine("Functions constructor");
    }


    public static void ProcessQueueMessage
    (
      [QueueTrigger("teste")]
      string message,
      ILogger logger
    )
    {
      // use my injected stuff
    }
  }
公共类函数
{
私有静态IOPS _myConnStr;
专用静态MyEmail _MyEmail;
私有静态IMyFunc _myFunc;
公共函数(IOOptions ConnectionString、MyEmail、MyFunc、MyFunc)
{
_myConnStr=连接字符串;
_myEmail=myEmail;
_myFunc=myFunc;
Console.WriteLine(“函数构造函数”);
}
公共静态void ProcessQueueMessage
(
[队列触发器(“测试”)]
字符串消息,
ILogger记录器
)
{
//用我注射的东西
}
}

非常感谢。

Azure功能的工作方式与您以前的工作方式有所不同。您可以执行以下操作:

using System;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Logging;

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddHttpClient();

            builder.Services.AddSingleton((s) => {
                return new MyService();
            });

            builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
        }
    }
}
使用系统;
使用Microsoft.Azure.Functions.Extensions.DependencyInjection;
使用Microsoft.Extensions.DependencyInjection;
使用Microsoft.Extensions.Http;
使用Microsoft.Extensions.Logging;
[程序集:函数启动(typeof(MyNamespace.Startup))]
名称空间MyNamespace
{
公共类启动:函数启动
{
公共覆盖无效配置(IFunctionsHostBuilder)
{
builder.Services.AddHttpClient();
builder.Services.AddSingleton((s)=>{
返回新的MyService();
});
builder.Services.AddSingleton();
}
}
}

您可以在Microsoft主页上阅读更多信息:

Azure功能的工作方式与您以前的工作方式有所不同。您可以执行以下操作:

using System;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Logging;

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddHttpClient();

            builder.Services.AddSingleton((s) => {
                return new MyService();
            });

            builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
        }
    }
}
使用系统;
使用Microsoft.Azure.Functions.Extensions.DependencyInjection;
使用Microsoft.Extensions.DependencyInjection;
使用Microsoft.Extensions.Http;
使用Microsoft.Extensions.Logging;
[程序集:函数启动(typeof(MyNamespace.Startup))]
名称空间MyNamespace
{
公共类启动:函数启动
{
公共覆盖无效配置(IFunctionsHostBuilder)
{
builder.Services.AddHttpClient();
builder.Services.AddSingleton((s)=>{
返回新的MyService();
});
builder.Services.AddSingleton();
}
}
}

您可以在Microsoft主页上阅读更多信息:

如果通过构造函数在函数中使用依赖项注入,那么函数本身需要是实例成员而不是静态成员

在示例中没有调用构造函数,因为函数是静态的,因此不需要调用实例构造函数

public class Functions {
    private readonly IOptions<Secrets.ConnectionStrings> connectionStrings;
    private readonly MyEmail myEmail;
    private readonly IMyFunc myFunc;

    public Functions(IOptions<Secrets.ConnectionStrings> connectionStrings, MyEmail myEmail, MyFunc MyFunc) {
        this.connectionString = connectionStrings;
        this.myEmail = myEmail;
        this.myFunc = myFunc;

        Console.WriteLine("Functions constructor");
    }

    public void ProcessQueueMessage(
        [QueueTrigger("teste")]
        string message,
        ILogger logger
    ) {
        // use my injected stuff
    }
}
公共类函数{
私有只读IOptions连接字符串;
私人只读邮件;
私有只读IMyFunc myFunc;
公用函数(IOOptions ConnectionString、MyEmail、MyFunc、MyFunc){
this.connectionString=连接字符串;
this.myEmail=myEmail;
this.myFunc=myFunc;
Console.WriteLine(“函数构造函数”);
}
公共无效处理队列消息(
[队列触发器(“测试”)]
字符串消息,
ILogger记录器
) {
//用我注射的东西
}
}
从这里开始,只需遵循文档中的细节即可


Reference如果通过构造函数在函数中使用依赖项注入,那么函数本身需要是实例成员而不是静态成员

在示例中没有调用构造函数,因为函数是静态的,因此不需要调用实例构造函数

public class Functions {
    private readonly IOptions<Secrets.ConnectionStrings> connectionStrings;
    private readonly MyEmail myEmail;
    private readonly IMyFunc myFunc;

    public Functions(IOptions<Secrets.ConnectionStrings> connectionStrings, MyEmail myEmail, MyFunc MyFunc) {
        this.connectionString = connectionStrings;
        this.myEmail = myEmail;
        this.myFunc = myFunc;

        Console.WriteLine("Functions constructor");
    }

    public void ProcessQueueMessage(
        [QueueTrigger("teste")]
        string message,
        ILogger logger
    ) {
        // use my injected stuff
    }
}
公共类函数{
私有只读IOptions连接字符串;
私人只读邮件;
私有只读IMyFunc myFunc;
公用函数(IOOptions ConnectionString、MyEmail、MyFunc、MyFunc){
this.connectionString=连接字符串;
this.myEmail=myEmail;
this.myFunc=myFunc;
Console.WriteLine(“函数构造函数”);
}
公共无效处理队列消息(
[队列触发器(“测试”)]
字符串消息,
ILogger记录器
) {
//用我注射的东西
}
}
从这里开始,只需遵循文档中的细节即可

参考检查此博客。检查此博客。