簡體   English   中英

依賴注入不適用於 Azure Functions

[英]Dependecy Injection doesn't work with Azure Functions

我在 Azure Functions 中遇到了依賴注入問題。 我在 stackoverflow 上閱讀了所有指南和任何問題,但找不到解決方案。

我正在使用 Visual Studio 2019 和 Azurite 在我的本地機器上進行測試。 我試圖在沒有的情況下制作一個項目,它工作正常。 該項目是一個帶有 HttpTrigger 的 Azure Functions。

這是我的github存儲庫的鏈接

我在這里粘貼我的啟動代碼:

[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 類中將 _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; } }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM