简体   繁体   English

依赖注入不适用于 Azure Functions

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

I have a problem with dependecy injection in Azure Functions.我在 Azure Functions 中遇到了依赖注入问题。 I read every guide and any issue here on stackoverflow but I can't found a solution.我在 stackoverflow 上阅读了所有指南和任何问题,但找不到解决方案。

I'm working with Visual Studio 2019 and Azurite for testing in my local machine.我正在使用 Visual Studio 2019 和 Azurite 在我的本地机器上进行测试。 I tried to make a project without and It works fine.我试图在没有的情况下制作一个项目,它工作正常。 The project is an Azure Functions with HttpTrigger.该项目是一个带有 HttpTrigger 的 Azure Functions。

Here the link to my github repository这是我的github存储库的链接

I paste here my Startup's code:我在这里粘贴我的启动代码:

[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>();
        }
    }
} 

And my Program's code:还有我的程序代码:

namespace ZanettiClod.SampleAzureFunctions
{
    public class Program
    {
        public static void Main()
        {

            var host = new HostBuilder()
                .ConfigureFunctionsWorkerDefaults()
                .Build();
            host.Run();
        }
    }
}

My GetProducts's Code:我的 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;
        }
    }
}

And here is the error I get back: screeshot这是我返回的错误: screeshot

Thanks in advance for the help在此先感谢您的帮助

You could make below changes to make it work.您可以进行以下更改以使其正常工作。 I tested for Dependency injection and it worked.我测试了依赖注入,它奏效了。

  1. Move dependency injection from startup.cs to program.cs.将依赖注入从 startup.cs 移到 program.cs。 That's how it works for target framework .Net 5.0.这就是目标框架 .Net 5.0 的工作原理。 Documentation - https://docs.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide文档 - 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. Change the qualifier for _productService from static to readonly in CreateProduct class.在 CreateProduct 类中将 _productService 的限定符从静态更改为只读。 Dependency injection doesn't work on static member variables.依赖注入不适用于静态成员变量。 Also remove static qualifier from your function.还要从您的函数中删除静态限定符。

     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