У меня есть 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. Может кто-нибудь помочь мне исправить эту ошибку?
Имхо -> выберите версию .Net 8, потому что это LTS, и эта версия будет EOL в 2025 году.
Тогда вы в концепции изолированных воркеров, есть другой подход внешнего класса запуска.
ссылка: https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide?tabs=windows
Я попытался обновить версию .Net до 8.0, но та же проблема.
Я верю тебе, ты изменил свой способ запуска? как сейчас program.cs и работать с args.
Это определенно правильный путь @JuhiSaxena. Любое время, которое вы тратите на старую модель внутрипроцессных функций и .NET6, на самом деле будет потрачено впустую. Если вы можете потратить на это немного времени, переключитесь на внепроцессные (так называемые isolated
) функции и .NET8. Вы можете создать совершенно новый проект на основе шаблонов и посмотреть, как будет выглядеть новая структура проекта, что поможет при миграции.
Спасибо @Elty/ @julealgon, я перенес свой проект на модель изолированного рабочего, и это сработало.
Приятно слышать это @JuhiSaxena ;)
Есть ли ссылка в вашем файле csproj? Вероятно, вам следует добавить это к вопросу.