当前位置: 首页 > 知识库问答 >
问题:

具有依赖注入的Azure函数未启动,因为与ILogger的引用冲突

顾泰平
2023-03-14

设置一个引用其他网络标准项目的 Azure 函数,这些项目又引用 Microsoft.Extensions.Logging。

函数在本地运行时,没有任何对其他项目的引用,一切开始都很好。但是,一旦我添加了对其他项目之一的引用,我就会在启动时收到以下异常:

TestTrigger: Microsoft.Azure.WebJobs.Host: Error indexing method 'TestTrigger'.Microsoft.Azure.WebJobs.Host:无法绑定参数'log'以键入ILogger。确保绑定支持参数 Type。如果使用的是绑定扩展(例如 Azure 存储、ServiceBus、计时器等),请确保已在启动代码(例如生成器)中调用了扩展的注册方法。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的自定义类是netstandard 2.0项目的一部分。扩展.日志.抽象3 . 0 . 0 . 0 nu获取包。functions项目本身是一个netcoreapp2.1项目,它也引用了相同的nuget包,以及Microsoft。函数1.0.29,微软。azure . functions . extensions 1 . 0 . 0和微软。NETCore.App 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个答案

太叔马鲁
2023-03-14

复制了您的错误:

似乎错误来自参考项目。

解决方案:

正在降级< code>Microsoft的版本。2.2.0的扩展. logging . abstracts 。

原因:

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

 类似资料:
  • 我使用 .NET 5 创建了一个 Azure 函数版本 3,并通过类的构造函数进行依赖关系注入。请参阅下面的虚拟代码: 在类中添加了范围。 程序文件如下所示: 在文件中有这行代码: 问题是当我想运行 Azure 函数时。我有这个警告: 未找到作业函数。试着公开你的作业类和方法。如果您使用的是绑定扩展(例如Azure存储、ServiceBus、定时器等),请确保您在启动代码中调用了扩展的注册方法(例

  • 我有一个时间触发的Azure功能

  • 我有一个关于 azure 函数 v1 中的依赖注入的新问题。 实际情况: 我有一个azure函数V1,我想在其中引用我的业务服务,而无需重新发明轮子即可使用我的服务。我在Internet上搜索并找到了这篇来自Microsoft的有趣文章。 但是,它似乎只适用于azure函数v2(. net core),因为每当我尝试安装时,我总是收到以下错误: 检测到Microsoft.Azure.WebJobs

  • 我已经成功地将依赖注入用于我自己的自定义服务,如本文所述。 我想要的是在我的定制服务中使用框架作为参数注入Azure函数的绑定器。用作函数参数的示例: 我尝试将Binder作为参数添加到我的服务构造函数并让框架创建我的服务实例,但传入的Binder始终为空。 我的服务构造函数: 注册如下: 有人知道这是否可能吗?如果可能,我做错了什么?

  • 我有一个自定义类,它有一个参数化构造函数 因此,实例化时需要3个参数。如果我想将这个类作为依赖项添加,我发现在Spring中没有直接的方法可以做到这一点。 我知道我可以简单地创建一个类的新实例并使用它的方法。但是我找不到任何直接的方法将这个类注入我的另一个类,即Rest控制器。 需要注意的是:所有3个参数都需要在运行时传递。我不能从属性文件中使用它们 即使Spring中没有直接的方法,我也想知道定

  • 我正在使用< code>Azure Function v2。下面是我使用构造函数注入的函数: 我在从派生的Startup类中声明了我要注入Azure函数的所有依赖项: Azure函数调用其他依赖于ILogger的注入服务,例如< code > iaccountworf : 问题在于DI找不到任何<code>ILogger 问题 如何在< code>IWebJobsStartup中设置< code>