C# ASP.NET核心Web作业DI
我想在我的WebJobs中使用DI,就像在WebApps中使用DI一样,但老实说,我不知道Functions.cs是如何调用的。如果在Functions.cs的构造函数中插入Console.WriteLine,则不会打印它 我怎样才能做到这一点 Program.csC# 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
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记录器
) {
//用我注射的东西
}
}
从这里开始,只需遵循文档中的细节即可
参考检查此博客。检查此博客。