C# .NET Azure函数-依赖项注入问题

C# .NET Azure函数-依赖项注入问题,c#,dependency-injection,azure-functions,azure-function-app,C#,Dependency Injection,Azure Functions,Azure Function App,my Azure Function v2项目中的Startup.cs时: using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; using MyCompany.MyLib.Contracts; //namespace from external library [assembly: FunctionsStartup(typeo

my Azure Function v2项目中的Startup.cs时:

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using MyCompany.MyLib.Contracts; //namespace from external library

[assembly: FunctionsStartup(typeof(Startup))]
namespace Test
{
    public class Startup : FunctionsStartup
    {
       public override void Configure(IFunctionsHostBuilder builder)
      {            
        builder.Services.AddTransient(typeof(Logging.ILogger<>), typeof(Logging.Logger<>));
        builder.Services.AddTransient<IUserLogic, UserLogic>();
        builder.Services.AddTransient<IBillingLogic, BillingLogic>(); //---> loads up from above referenced "MyCompany.MyLib.Contracts" namespace and this namespace is from externally referenced class library but with in same solution
    }
}
使用Microsoft.Azure.Functions.Extensions.DependencyInjection;
使用Microsoft.Extensions.DependencyInjection;
使用MyCompany.MyLib.Contracts//来自外部库的命名空间
[组装:功能启动(类型(启动))]
名称空间测试
{
公共类启动:函数启动
{
公共覆盖无效配置(IFunctionsHostBuilder)
{            
builder.Services.AddTransient(typeof(Logging.ILogger)、typeof(Logging.Logger));
builder.Services.AddTransient();
builder.Services.AddTransient();//-->从上面引用的“MyCompany.MyLib.Contracts”命名空间加载,此命名空间来自外部引用的类库,但在同一解决方案中使用
}
}
}

上面的代码带有function app project中我自己的自定义类,如“EmailLogic”、“Logger”可以正常工作

但当我将自定义类添加到服务容器(如外部C#library项目中的“BillingLogic”)中时,它提出了以下问题:外部C#library项目是作为现有visual studio解决方案中的参考项目添加的:

“在启动操作'945918c0-af3a-4d50-ab1d-ac405d4f1c7b'期间发生主机错误。[2/3/2020 2:11:02 PM]MyFunction.functionPP:无法加载文件或程序集'MyCompany.MyLib.Contracts,版本=1.0.0,区域性=中性,PublicKeyToken=null'。无法找到或加载特定文件。(HRESULT异常:0x8013621).System.Private.CoreLib:无法加载文件或程序集“”MyCompany.MyLib.Contracts,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”

如果删除了“引用的外部项目”中的这些行

using MyCompany.MyLib.Contracts;
builder.Services.AddTransient<IBillingLogic, BillingLogic>();
使用MyCompany.MyLib.Contracts;
builder.Services.AddTransient();
startup.cs按预期工作,但对于我的解决方案,必须从引用的项目引用此外部类

My Azure函数csproj文件:

     <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <AzureFunctionsVersion>v2</AzureFunctionsVersion>
        <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
        <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
        <PackageReference Include="Microsoft.Azure.Storage.Queue" Version="11.1.2" />
        <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="3.0.8" />
        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" />
        <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
        <PackageReference Include="NLog" Version="4.6.8" />
        <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
        <PackageReference Include="NLog.Extensions.AzureStorage" Version="1.1.4" />
        <PackageReference Include="Microsoft.Azure.DocumentDB.Core" Version="2.9.2" />

      </ItemGroup>
      <ItemGroup>
        <ProjectReference Include="..\MyCSharpLib.DataStore\MyCSharpLib.DataStore.csproj">
          <Private>true</Private>
        </ProjectReference>
      </ItemGroup>
      <ItemGroup>
        <None Update="appsettings.json">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
          <CopyToPublishDirectory>Always</CopyToPublishDirectory>
        </None>
        <None Update="host.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
        <None Update="local.settings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
          <CopyToPublishDirectory>Never</CopyToPublishDirectory>
        </None>
        <None Update="nlog.config">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
          <CopyToPublishDirectory>Always</CopyToPublishDirectory>
        </None>
      </ItemGroup>
    </Project>
<ProjectReference Include="..\MyCSharpLib.DataStore\MyCSharpLib.DataStore.csproj">

netstandard2.0
v2
假的
假的
真的
总是
总是
保存最新
保存最新
从未
总是
总是
MyCSharpLib.DataStore.csproj文件:


netstandard2.0
win7-x64
x64
MyCSharpLib.DataStore

.\MyContractLib.Contracts\MyContractLib.Contracts.csproj
My Azure函数csproj文件:

     <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <AzureFunctionsVersion>v2</AzureFunctionsVersion>
        <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
        <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
        <PackageReference Include="Microsoft.Azure.Storage.Queue" Version="11.1.2" />
        <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="3.0.8" />
        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" />
        <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
        <PackageReference Include="NLog" Version="4.6.8" />
        <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
        <PackageReference Include="NLog.Extensions.AzureStorage" Version="1.1.4" />
        <PackageReference Include="Microsoft.Azure.DocumentDB.Core" Version="2.9.2" />

      </ItemGroup>
      <ItemGroup>
        <ProjectReference Include="..\MyCSharpLib.DataStore\MyCSharpLib.DataStore.csproj">
          <Private>true</Private>
        </ProjectReference>
      </ItemGroup>
      <ItemGroup>
        <None Update="appsettings.json">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
          <CopyToPublishDirectory>Always</CopyToPublishDirectory>
        </None>
        <None Update="host.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
        <None Update="local.settings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
          <CopyToPublishDirectory>Never</CopyToPublishDirectory>
        </None>
        <None Update="nlog.config">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
          <CopyToPublishDirectory>Always</CopyToPublishDirectory>
        </None>
      </ItemGroup>
    </Project>
<ProjectReference Include="..\MyCSharpLib.DataStore\MyCSharpLib.DataStore.csproj">
是通过对数据存储的引用,然后该数据存储对MyContractLib.Contracts有引用

但它并没有因为处理dll太愚蠢,所以要么让Azure函数csproj引用MyLib.Contracts 还是这样做

这是你所有的std库中添加的

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
PackageReference
所以在你的两个标准libs上

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

netstandard2.0
包装参考

如果这不起作用,我将删除

Hi@prkat,您能否将接口IBillingLogic与它的实现放在一起,以确保您没有遗漏任何内容。但加载startup.cs时出错,错误消息显示“无法加载文件或程序集'MyCompany.MyLib.Contracts',这是“使用”引用的命名空间关键字放在文件顶部。由于这个错误,保持在“Startup”类中的断点没有被命中。接口IBillingLogic没有问题&它的实现被其他非Azure功能项目正确使用,没有任何问题。只有在Azure功能项目中使用它才会产生问题。@prkat你能给我看两个项目的
csproj
吗?@HariHaran,根据错误附加了两个csproj文件,我认为您需要添加对另一个项目的引用
MyCompany.MyLib.Contracts
。请尝试将项目的dill添加到Azure函数projectIt不工作。我可以在Azure函数的bin文件夹中看到MyLib.Contracts.dll,但在运行该函数时,它会说“无法加载文件或程序集‘MyLib.Contracts’”,mmm认为我有它。如果将其加载到
var DLL=Assembly.LoadFile(“MyLib.Contracts”)
中,则不确定什么是
true