类中的DI不在功能中解析

时间:2020-05-27 12:20:54

标签: c# azure-functions

我已经为Azure函数设置了DI,但是当我运行该函数时它将无法解析。我的代码是:

启动

[assembly: FunctionsStartup(typeof(OmegaConnector.StartUp))]
namespace OmegaConnector
{
    public class StartUp : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

            builder.Services.AddLogging();
            builder.Services.AddVehicleSearchCosmosDataProvider();
            builder.Services.AddScoped<IProcessSearchData, SearchProcessor>(); <- This one
        }
    }

IProcessSearchData:

public interface IProcessSearchData
 {
    Task<bool> ProcessData(string campaign);
 }

SearchProcessor:

public class SearchProcessor : IProcessSearchData
    {

        public async Task<bool> ProcessData(string campaign)
        {
            return true;
        }
    }

功能:

 public OmegaConnectorFunction(ILogger<OmegaConnectorFunction> logger, IProcessSearchData searchProcessor)
        {

我得到了错误:

 Executed 'CatchCampaign' (Failed, Id=daef3371-fa4d-4d1f-abad-7ad343537872)
[27/05/2020 12:17:27] Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'OmegaConnector.Interfaces.IProcessSearchData' while attempting to activate 'OmegaConnector.OmegaConnectorFunction'.

很抱歉,如果这太简单了,但是我看不到我在哪里错了。我认为我已经正确设置了此设置,但显然没有。谁能看到我需要做什么?

3 个答案:

答案 0 :(得分:1)

据我对documentation provided by Microsoft的了解,问题可能是该服务需要注入到包含该函数的类中。

我不确定这是否是您从提供的代码示例中所做的。一个例子是:

public class OmegaConnectorFunction
{
    private readonly ILogger _logger;
    private readonly IProcessSearchData _searchProcessor;

    public OmegaConnectorFunction(ILogger<OmegaConnectorFunction> logger, IProcessSearchData searchProcessor) 
    {
        _logger = logger;
        _searchProcessor = searchProcessor;
    }

    [FunctionName("OmegaConnectorFunction")]
    public async Task<IActionResult> Run([HttpTrigger] HttpRequest request) 
    {
        var campaign = await request.Content.ReadAsAsync<string>();

        _searchProcessor.ProcessData(campaign);

        return new OkResult();
    }
}

答案 1 :(得分:1)

查看此处:https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library

Functions 3.x软件包在构建时考虑了.NET Core 3.1。

尝试使这些版本保持同步,这样就不会出现依赖项兼容性问题。

答案 2 :(得分:0)

public class OmegaConnectorFunction {
  private readonly IProcessSearchData _searchProcessor;

  public OmegaConnectorFunction(IProcessSearchData searchProcessor) 
  {
      _searchProcessor = searchProcessor;
  }

  [FunctionName("OmegaConnectorFunction")]
  public async Task<IActionResult> Run([HttpTrigger] HttpRequest request,  ILogger log) // ILogger is automatically imported  
  {
      var campaign = await request.Content.ReadAsAsync<string>();
      _searchProcessor.ProcessData(campaign);
      return new OkResult();
  }
}