Необходимо реализовать AddKeyedSingleton с помощью функции Azure

У меня есть DI ниже, который даст мне два разных DatabaseClients в моей функции Azure.

public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
{    
    _ = services.AddKeyedSingleton<IDbFactory>("TestCluster1", x =>
    {
        var dbFactory = new DbFactory(x.GetRequiredService<IConfiguration>(), x.GetRequiredService<IKeyVaultManager>(), "**TestCluster1**");
        return dbFactory;
    });

    _ = services.AddKeyedSingleton<IDbFactory>("TestCluster2", x =>
    {
        var dbFactory = new DbFactory(x.GetRequiredService<IConfiguration>(), x.GetRequiredService<IKeyVaultManager>(), "**TestCluster2**");
        return dbFactory;
    });
}

Мой Startup.cs выглядит так

[assembly: WebJobsStartup(typeof(StartUp))]

namespace MyNamespace
{
    public class StartUp : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            ConfigureServices(builder.Services);
        }

        private void ConfigureServices(IServiceCollection services)
        {
            // Configurations
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddConfiguration(services.BuildServiceProvider().GetRequiredService<IConfiguration>())
                .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

            services.AddInfrastructure(services, configuration);
        }
    }
}

Файл .csproj для FunctionApp выглядит так

<Project Sdk = "Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <DockerFastModeProjectMountDirectory>/home/site/wwwroot</DockerFastModeProjectMountDirectory>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include = "Azure.Identity" Version = "1.11.3" />
    <PackageReference Include = "Microsoft.Azure.WebJobs.Extensions.DurableTask" Version = "2.13.0" />
    <PackageReference Include = "Microsoft.Azure.WebJobs.Extensions.Storage" Version = "5.0.1" />
    <PackageReference Include = "Microsoft.Extensions.DependencyInjection" Version = "8.0.0" />
    <PackageReference Include = "Microsoft.Extensions.DependencyInjection.Abstractions" Version = "8.0.0" />
    <PackageReference Include = "Microsoft.NET.Sdk.Functions" Version = "4.2.0" />
    <PackageReference Include = "Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version = "1.17.2" />
  </ItemGroup>
</Project>

Поскольку AddKeyedSingleton требует Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, и я его установил, но в своем Startup.cs я получаю эту ошибку:

System.IO.FileNotFoundException: «Не удалось загрузить файл или сборку «Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60». Система не может найти указанный файл.'

Я проверил, что его переходный пакет загружается только как версия 8.0.0.0. Может кто-нибудь помочь мне исправить эту ошибку?

Есть ли ссылка в вашем файле csproj? Вероятно, вам следует добавить это к вопросу.

wanton 05.06.2024 15:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Имхо -> выберите версию .Net 8, потому что это LTS, и эта версия будет EOL в 2025 году.

Тогда вы в концепции изолированных воркеров, есть другой подход внешнего класса запуска.

ссылка: https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide?tabs=windows

Я попытался обновить версию .Net до 8.0, но та же проблема.

Juhi Saxena 05.06.2024 17:05

Я верю тебе, ты изменил свой способ запуска? как сейчас program.cs и работать с args.

Elty 05.06.2024 17:07

Это определенно правильный путь @JuhiSaxena. Любое время, которое вы тратите на старую модель внутрипроцессных функций и .NET6, на самом деле будет потрачено впустую. Если вы можете потратить на это немного времени, переключитесь на внепроцессные (так называемые isolated) функции и .NET8. Вы можете создать совершенно новый проект на основе шаблонов и посмотреть, как будет выглядеть новая структура проекта, что поможет при миграции.

julealgon 05.06.2024 20:48

Спасибо @Elty/ @julealgon, я перенес свой проект на модель изолированного рабочего, и это сработало.

Juhi Saxena 06.06.2024 19:25

Приятно слышать это @JuhiSaxena ;)

julealgon 06.06.2024 21:22

Другие вопросы по теме