【问题标题】:How to access a DurableEntityClient in an injected class with Azure Durable Functions如何使用 Azure Durable Functions 在注入的类中访问 DurableEntityClient
【发布时间】: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


【解决方案1】:

根据我的 github 问题的回答,似乎可以在 Startup 中注入它,因为 2.4.0 版本的 Microsoft.Azure.WebJobs.Extensions.DurableTask 包:

一些代码sn-ps:

Startup.cs

builder.Services.AddSingleton<IReceiver, TableReceiver>();
builder.Services.AddDurableClientFactory();

引用类

public class TableReceiver : IReceiver
{
    private IDurableEntityClient _entityClient;

    public TableReceiver(IDurableClientFactory entityClientFactory, IConfiguration configuration)
    {
        _entityClient = entityClientFactory.CreateClient(new DurableClientOptions
            {
                TaskHub = configuration["TaskHubName"]
            });
    }
}

Github issue

【讨论】:

  • 这很好用,谢谢!虽然我不认为你打算在参数中传递IDurableEntityClient,因为它未使用并且在这种情况下仍然为空。
  • 谢谢,默里 - 你是对的。将更新示例代码。
猜你喜欢
  • 2021-06-25
  • 2023-01-31
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多