依赖注入不适用于 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

在此先感谢您的帮助

您可以进行以下更改以使其正常工作。我测试了依赖注入并且它有效。

  1. 将依赖注入从 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();
             }
         }
     }
    
  2. 在 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;
         }
     }
    

    }