【发布时间】:2019-02-26 00:30:07
【问题描述】:
我正在使用Azure Function v2。这是我使用构造函数注入的函数:
public sealed class FindAccountFunction
{
private readonly IAccountWorkflow m_accountWorkflow;
private readonly IMapper m_mapper;
private readonly ILogger m_logger;
public FindAccountFunction(ILogger logger, IMapper mapper, IAccountWorkflow accountWorkflow)
{
m_logger = logger;
m_mapper = mapper;
m_accountWorkflow = accountWorkflow;
}
[FunctionName("FindAccount")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger logger)
{
// Do stuff.
}
}
我在派生自 IWebJobsStartup 的 Startup 类中声明了我想要注入到 Azure 函数中的所有依赖项:
public sealed class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder webJobsBuilder)
{
// Registers the application settings' class.
webJobsBuilder.Services.AddSingleton<IApplicationSettings, ApplicationSettings>();
// ** Registers the ILogger instance **
// ** ?? **
// Registers the IMapper instance for the contracts.
var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfile(new MyProfile()));
webJobsBuilder.Services.AddSingleton(mapperConfiguration.CreateMapper());
// Registers custom services.
webJobsBuilder.Services.AddTransient<IStorageService, StorageService>();
webJobsBuilder.Services.AddTransient<IAccountWorkflow, AccountWorkflow>();
}
}
Azure 函数调用其他也依赖 ILogger 的注入服务,例如 IAccountWorkflow:
public sealed class AccountWorkflow : IAccountWorkflow
{
public AccountWorkflow(ILogger logger, IStorageService storageService)
{
if(logger is null)
throw new ArgumentNullException();
}
}
问题在于 DI 无法找到任何 ILogger 实现并且无法解析服务,因为注入了一个空的 ILogger。
问题
如何在IWebJobsStartup 中设置ILogger 的注入?
【问题讨论】:
-
我认为函数应该是静态的?
-
天哪 :) 。我今天才发现这一点,这让我很开心。现在,我们可以删除 static 关键字并进行一些甜蜜的 ctor 注入。我只需要注入该死的记录器就可以让它变得完美:)
-
哦,这是新的吗?有没有我可以研究的文档?
-
@Nkosi 这是在天蓝色函数中使用 DI 的工作的一部分。你可以看看这个问题:Dependency Injection support for Functions。见
Port changes to enable instance methods -
@Nkosi 因此,自运行时 v2.0.12265 起支持实例方法:Azure Functions Runtime 2.0.12265
标签: c# azure dependency-injection azure-functions