依赖注入不适用于 Azure Functions
Dependecy Injection doesn't work with Azure Functions
我在 Azure Functions 中遇到依赖注入问题。我在 Whosebug 上阅读了所有指南和任何问题,但找不到解决方案。
我正在使用 Visual Studio 2019 和 Azurite 在我的本地机器上进行测试。我试图在没有的情况下制作一个项目并且它工作正常。
该项目是一个带有 HttpTrigger 的 Azure Functions。
这里link到my github repository
我在这里粘贴我的启动代码:
[assembly: FunctionsStartup(typeof(Startup))]
namespace ZanettiClod.SampleAzureFunctions
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
builder.Services.AddSingleton<IProductService, ProductService>();
builder.Services.AddSingleton<IProductRepository<Product>, ProductRepository>();
}
}
}
我的程序代码:
namespace ZanettiClod.SampleAzureFunctions
{
public class Program
{
public static void Main()
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.Build();
host.Run();
}
}
}
我的 GetProducts 代码:
namespace ZanettiClod.SampleAzureFunctions
{
public class GetProducts
{
private readonly IProductService _productService;
public GetProducts(IProductService productService)
{
_productService = productService;
}
[Function("GetProducts")]
public async Task<HttpResponseData> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get")]
HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger("GetProducts");
logger.LogInformation("C# HTTP trigger function processed a request.");
var products = await _productService.GetAllProducts();
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(products);
return response;
}
}
}
这是我返回的错误:
screeshot
在此先感谢您的帮助
您可以进行以下更改以使其正常工作。我测试了依赖注入并且它有效。
将依赖注入从 startup.cs 移动到 program.cs。这就是目标框架 .Net 5.0 的工作方式。
文档 - https://docs.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide
namespace ZanettiClod.SampleAzureFunctions
{
public class Program
{
public static void Main()
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(s =>
{
s.AddHttpClient();
s.AddSingleton<IProductService, ProductService>();
s.AddSingleton<IProductRepository<Product>, ProductRepository>();
})
.Build();
host.Run();
}
}
}
在 CreateProduct class 中将 _productService 的限定符从静态更改为只读。依赖注入不适用于静态成员变量。同时从您的函数中删除静态限定符。
public class CreateProduct
{
private readonly IProductService _productService;
public CreateProduct(IProductService productService)
{
_productService = productService;
}
[Function("CreateProduct")]
public async Task<HttpResponseData> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger("CreateProduct");
logger.LogInformation("C# HTTP trigger function processed a request.");
var product = await req.ReadFromJsonAsync<Product>();
_productService.CreateProduct(product);
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(
new
{
Result = true,
Message = $"Name: {product.Name}, Price: {product.Price}"
});
return response;
}
}
}
我在 Azure Functions 中遇到依赖注入问题。我在 Whosebug 上阅读了所有指南和任何问题,但找不到解决方案。
我正在使用 Visual Studio 2019 和 Azurite 在我的本地机器上进行测试。我试图在没有的情况下制作一个项目并且它工作正常。 该项目是一个带有 HttpTrigger 的 Azure Functions。
这里link到my github repository
我在这里粘贴我的启动代码:
[assembly: FunctionsStartup(typeof(Startup))]
namespace ZanettiClod.SampleAzureFunctions
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
builder.Services.AddSingleton<IProductService, ProductService>();
builder.Services.AddSingleton<IProductRepository<Product>, ProductRepository>();
}
}
}
我的程序代码:
namespace ZanettiClod.SampleAzureFunctions
{
public class Program
{
public static void Main()
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.Build();
host.Run();
}
}
}
我的 GetProducts 代码:
namespace ZanettiClod.SampleAzureFunctions
{
public class GetProducts
{
private readonly IProductService _productService;
public GetProducts(IProductService productService)
{
_productService = productService;
}
[Function("GetProducts")]
public async Task<HttpResponseData> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get")]
HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger("GetProducts");
logger.LogInformation("C# HTTP trigger function processed a request.");
var products = await _productService.GetAllProducts();
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(products);
return response;
}
}
}
这是我返回的错误: screeshot
在此先感谢您的帮助
您可以进行以下更改以使其正常工作。我测试了依赖注入并且它有效。
将依赖注入从 startup.cs 移动到 program.cs。这就是目标框架 .Net 5.0 的工作方式。 文档 - https://docs.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide
namespace ZanettiClod.SampleAzureFunctions { public class Program { public static void Main() { var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(s => { s.AddHttpClient(); s.AddSingleton<IProductService, ProductService>(); s.AddSingleton<IProductRepository<Product>, ProductRepository>(); }) .Build(); host.Run(); } } }
在 CreateProduct class 中将 _productService 的限定符从静态更改为只读。依赖注入不适用于静态成员变量。同时从您的函数中删除静态限定符。
public class CreateProduct { private readonly IProductService _productService; public CreateProduct(IProductService productService) { _productService = productService; } [Function("CreateProduct")] public async Task<HttpResponseData> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req, FunctionContext executionContext) { var logger = executionContext.GetLogger("CreateProduct"); logger.LogInformation("C# HTTP trigger function processed a request."); var product = await req.ReadFromJsonAsync<Product>(); _productService.CreateProduct(product); var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync( new { Result = true, Message = $"Name: {product.Name}, Price: {product.Price}" }); return response; } }
}