gpt4 book ai didi

c# - 当服务具有其他依赖项时,无法让注入(inject)在 Azure Functions 中工作

转载 作者:行者123 更新时间:2023-12-03 01:32:50 24 4
gpt4 key购买 nike

我有一个服务CompanyService

此服务依赖于另外 2 个服务 - ICompanyRepositoryIDataCacheService

public class CompanyService : ICompanyService
{
private readonly ICompanyRepository _companyRepository;
private IDataCacheService _dataCacheService;

public CompanyService(ICompanyRepository companyRepository, IDataCacheService dataCacheService)
{
_companyRepository = companyRepository;
_dataCacheService = dataCacheService;
}
}

该服务本身没有依赖项

现在我需要通过 Azure 函数中的内置注入(inject)来使其可用

因此,在 Startup.cs 中,我修改了 Configure 以添加新服务

public override void Configure(IFunctionsHostBuilder builder)
{
var cosmosDbConnectionString = new CosmosDBConnectionString(Environment.GetEnvironmentVariable("CosmosDBConnection"));
builder.Services.AddSingleton<IDocumentClient>(s =>
new DocumentClient(cosmosDbConnectionString.ServiceEndpoint, cosmosDbConnectionString.AuthKey));

var companyRepository = new CompanyRepository();
builder.Services.AddSingleton<ICompanyRepository>(companyRepository);

var dataCacheService = new DataCacheService();
builder.Services.AddSingleton<IDataCacheService>(dataCacheService);

var companyService = new CompanyService(companyRepository, dataCacheService);

builder.Services.AddSingleton<ICompanyService>(companyService);
}

编译并运行良好

但是,当我添加 ICompanyService 作为函数的参数时,我收到错误

Cannot bind parameter 'companyService' to type ICompanyService

我的方法如下

public class Companies
{
private const string OperationName = "OPERATION";

[FunctionName(OperationName)]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "myroute/")]HttpRequest req,
ICompanyService companyService,
ILogger log)
{
//logic here
}
}

这与我的项目中的其他函数运行方法相同

我做错了什么?

这也不适用于标准 AddSingleton 语法

builder.Services.AddSingleton<ICompanyService, CompanyService>();

保罗

最佳答案

根据所示配置,注册可以简化为

public override void Configure(IFunctionsHostBuilder builder) {
var services = builder.Services;
var cosmosDbConnectionString = new CosmosDBConnectionString(Environment.GetEnvironmentVariable("CosmosDBConnection"));
services.AddSingleton<IDocumentClient>(s =>
new DocumentClient(cosmosDbConnectionString.ServiceEndpoint, cosmosDbConnectionString.AuthKey));

services.AddSingleton<ICompanyRepository, CompanyRepository>();
services.AddSingleton<IDataCacheService, DataCacheService>();
services.AddSingleton<ICompanyService, CompanyService>();
}

剩下的就是确保通过构造函数注入(inject)将所需的服务显式注入(inject)到函数实例中。

public class Companies {
private const string OperationName = "OPERATION";
private readonly ICompanyService companyService;

public Companies(ICompanyService companyService) {
this.companyService = companyService;
}

[FunctionName(OperationName)]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "myroute/")]HttpRequest req,
ILogger log) {
//logic here
}
}

引用Use dependency injection in .NET Azure Functions

关于c# - 当服务具有其他依赖项时,无法让注入(inject)在 Azure Functions 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60694128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com