. NET Azure Функции - проблема внедрения зависимостей - PullRequest
2 голосов
/ 03 февраля 2020

На Startup.cs в моем Azure проекте Function v2:

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
    }
}

}

Приведенный выше код с моими собственными пользовательскими классами в проекте приложения функции например «EmailLogi c», «Logger» работает нормально.

Но в тот момент, когда я добавил пользовательские классы в контейнер служб, например «BillingLogi c» из внешнего C# проекта библиотеки который добавляется в качестве эталонного проекта из существующего решения Visual Studio, которое выдает ниже проблема:

" Ошибка хоста во время операции запуска '945918c0-af3a-4d50-ab1d-ac405d4f1c7b '. [3/3/2020 14:11:02 PM] MyFunction.FunctionApp: не удалось загрузить файл или сборку' MyCompany.MyLib.Contracts , версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null '. Не удалось найти или загрузить указанный файл c. (Исключение из HRESULT: 0x80131621). System.Private.CoreLib: Не удалось загрузить файл или сборку' ' MyCompany.MyLib.Contracts , версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = ноль"* 10 21 *

Если эти строки из «ссылочных внешних проектов» будут удалены,

using MyCompany.MyLib.Contracts;
builder.Services.AddTransient<IBillingLogic, BillingLogic>();

startup.cs работает как положено, но ссылка на этот внешний класс из ссылочного проекта обязательна для моего решения.

Моя Azure функция csproj file:

     <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>

MyCSharpLib.DataStore.csproj file:

      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
        <Platforms>x64</Platforms>
      </PropertyGroup>

      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />

      <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Cosmos.Table" Version="1.0.6" />
        <PackageReference Include="Microsoft.Azure.DocumentDB.Core" Version="2.9.2" />
        <PackageReference Include="Microsoft.Azure.Storage.Blob" Version="11.1.1" />
        <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
        <PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.1" />
        <PackageReference Include="Polly" Version="5.3.1" />
        <PackageReference Include="StackExchange.Redis" Version="1.2.6" />
      </ItemGroup>

      <ItemGroup>
        <ProjectReference Include="..\MyContractLib.Contracts\MyContractLib.Contracts.csproj" />          
      </ItemGroup>

    </Project>

1 Ответ

0 голосов
/ 04 февраля 2020

MyCSharpLib.DataStore

.\MyContractLib.Contracts\MyContractLib.Contracts.csproj

Файл csproj функции My Azure:

<ProjectReference Include="..\MyCSharpLib.DataStore\MyCSharpLib.DataStore.csproj">

, поэтому

using MyCompany.MyLib.Contracts;

проходит через ссылку на DataStore, которая затем имеет ссылку на MyContractLib.Contracts

Но она не копирует dll как глупую, поэтому либо получите Azure функцию csproj для ref MyLib.Contracts, либо сделайте это Как установить зависимости при использовании . NET Стандартные библиотеки DLL 2.0 с консольным приложением. NET Framework?

, которое есть на всех ваших стандартных библиотеках, добавьте

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>

, так что на обеих ваших стандартных библиотеках

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

если это не сработает, я удалю

...