【发布时间】:2020-12-16 15:59:28
【问题描述】:
我有一个利用依赖注入的 Azure Functions 项目(Startup.cs 基于不同的接口注入服务)。那些实现接口的服务也在使用构造函数依赖注入。
在其中一个实现中,我想在持久实体上调用一个方法,但我不希望将 DurableEntityClient 作为方法签名的一部分(因为其他实现可能根本不需要 EntityClient)。因此,我希望看到 IDurableEntityClient 注入到我的类的构造函数中。
但事实证明该值为null。想知道这是否受支持且可行? (有一种 DI 友好的方式来注入想要为它们正在运行的 Functions 运行时获取 EntityClient 的类)
一些代码sn-ps:
Startup.cs
builder.Services.AddSingleton<IReceiver, TableReceiver>();
实际功能
public class ItemWatchHttpTrigger
{
private IReceiver _receiver;
public ItemWatchHttpTrigger(IReceiver receiver)
{
_receiver = receiver;
}
[FunctionName("item-watcher")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "item/{itemId}")]
HttpRequest request, string itemId, [DurableClient] IDurableEntityClient client, ILogger logger)
{
// Actual implementation
}
}
引用类
public class TableReceiver : IReceiver
{
private IDurableEntityClient _entityClient;
public TableReceiver(IDurableEntityClient client)
{
_entityClient = client; // client is null :(
}
}
【问题讨论】:
-
IDurableEntityClient被绑定为绑定参数。我认为您不能通过 DI 在构造函数中使用注入。您可以在IReceiver方法中公开一个方法以接受IDurableEntityClient可以由IReceiver的调用者传递。 -
我同意这是一种解决方法,但这不是我喜欢的解决方法,因为我相信
IDurableEntityClient是实现的一部分,不应成为接口声明的一部分。最好的方法是 SDK 中的DurableEntityClient.GetFromContext() -
不确定,因为我没有使用它,但您似乎可以通过
services.AddDurableTask();注入IDurableClientFactory并检索/创建一个新的IDurableClient客户端。IDurableClient继承自IDurableEntityClient。见here。检查是否可以在从工厂检索到的对象上调用IDurableEntityClient公开的方法。 -
是的,我正要发布这个作为答案,因为我得到这个是为了回复我的 github 问题。会写出来。交易
标签: dependency-injection azure-functions azure-durable-functions