由于与ILogger的引用冲突,带有依赖项注入的Azure函数无法启动

时间:2019-11-03 12:27:49

标签: c# azure dependency-injection .net-core azure-functions

设置一个Azure功能,该功能引用其他netstandard项目,而这些netstandard项目又引用了Microsoft.Extensions.Logging。

当函数在本地运行而没有对其他项目的任何引用时,一切正常。但是,一旦添加对其他项目之一的引用,启动时就会出现以下异常:

  

TestTrigger:Microsoft.Azure.WebJobs.Host:错误索引方法“ TestTrigger”。 Microsoft.Azure.WebJobs.Host:无法将参数“ log”绑定到ILogger类型。确保绑定支持参数类型。如果您使用绑定扩展(例如Azure存储,ServiceBus,Timer等),请确保已在启动代码中调用了扩展的注册方法(例如builder.AddAzureStorage(),builder.AddServiceBus( ),builder.AddTimers()等)。

这是我的计时器功能的初始代码

public class TestTrigger
{
    private ITester _tester;
    public TestTrigger(ITester tester)
    {
        _tester = tester;
    }

    [FunctionName("TestTrigger")]
    public void Run([TimerTrigger("* * * * * *")] TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.UtcNow}");
        _tester?.TestMethod().Wait();
    }
}

我在下面的Startup类中注入了我的依赖项

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
            var cfgBuilder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile($"appsettings.json", true, true)
                .AddJsonFile($"appsettings.dev.json", true, true)
                .AddEnvironmentVariables();
            var configuration = cfgBuilder.Build();
            builder.Services
                .AddSingleton<ITester, Tester>()
                .AddLogging()
                .AddOptions();
    }
}

实现ITester的自定义类是引用Microsoft.Extensions.Logging.Abstractions 3.0.0.0 nuget包的netstandard 2.0项目的一部分。函数项目本身是一个netcoreapp2.1项目,该项目还引用了相同的nuget包以及Microsoft.NET.Sdk.Functions 1.0.29,Microsoft.Azure.Functions.Extensions 1.0.0和Microsoft.NETCore。应用2.1.0软件包。

csproj文件供参考:

功能项目

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netcoreapp2.1</TargetFramework>
        <AzureFunctionsVersion></AzureFunctionsVersion>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
        <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
    </ItemGroup>
    <ItemGroup>
        <None Update="host.json">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
        <None Update="local.settings.json">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
            <CopyToPublishDirectory>Never</CopyToPublishDirectory>
        </None>
    </ItemGroup>
    <ItemGroup>
      <ProjectReference Include="..\TestLibrary\TestLibrary.csproj" />
    </ItemGroup>
</Project>

引用的项目:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
      <PackageReference Include="Microsoft.Extensions.Logging" Version="2.2.0" />
      <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0" />
    </ItemGroup>

</Project>

我很确定这是参考问题,但不能动手处理。 有帮助吗?

1 个答案:

答案 0 :(得分:1)

再现了您的错误:

enter image description here

似乎错误来自参考项目。

解决方案:

Microsoft.Extensions.Logging.Abstractions的版本降级为2.2.0。

原因:

绑定引擎无法识别您的参数类型,因为它们来自不同的程序集。