Как получить доступ к DurableEntityClient во внедренном классе с помощью устойчивых функций Azure

У меня есть проект функций Azure, который использует внедрение зависимостей (Startup.cs внедряет службы на основе разных интерфейсов). Те службы, которые реализуют интерфейсы, также используют внедрение зависимостей конструктора.

В одной из этих реализаций я хочу вызвать метод для Durable Entity, но я предпочитаю не делать часть DurableEntityClient сигнатуры метода (поскольку в других реализациях EntityClient может вообще не понадобиться). Поэтому я надеялся увидеть, что IDurableEntityClient вводится в конструктор моего класса.

Но оказывается, что значение равно null. Хотите знать, поддерживается ли это и осуществимо ли это? (чтобы иметь дружественный к DI способ внедрения классов, которые хотят получить EntityClient для среды выполнения функций, в которой они работают)

Некоторые фрагменты кода:

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.
user1672994 21.12.2020 13:26

Я согласен, что это был бы обходной путь, но мне он не нравится, поскольку я считаю, что IDurableEntityClient является частью реализации и не должен быть частью объявления интерфейса. Лучше всего будет что-то вроде DurableEntityClient.GetFromContext() в SDK.

Sam Vanhoutte 21.12.2020 15:13

Не уверен, так как я не использовал его, но кажется, что вы можете внедрить IDurableClientFactory через services.AddDurableTask(); и получить/создать новый IDurableClient клиент. IDurableClient наследуется от IDurableEntityClient . Смотрите здесь. Проверьте, можете ли вы вызвать метод, предоставленный IDurableEntityClient, для полученного объекта с фабрики.

user1672994 21.12.2020 16:06

Да, я как раз собирался опубликовать это как ответ, так как получил это в ответ на мою проблему с github. Выпишет. TX

Sam Vanhoutte 21.12.2020 16:08
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Лучшие практики использования Guice в ваших Java-проектах
Лучшие практики использования Guice в ваших Java-проектах
Guice от Google - это популярная система инъекции зависимостей для Java-приложений. Он помогает разработчикам создавать более ремонтопригодный,...
4
5
1 591
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на ответе на мою проблему с github, кажется, что это можно внедрить в автозагрузку, поскольку 2.4.0 версия пакета Microsoft.Azure.WebJobs.Extensions.DurableTask:

Некоторые фрагменты кода:

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

Это хорошо работает, спасибо! Хотя я не думаю, что вы хотели передать IDurableEntityClient в параметрах, поскольку в этом случае он не используется и по-прежнему равен нулю.

Murray 30.12.2020 14:10

Спасибо, Мюррей, ты прав. Будет обновлен образец кода.

Sam Vanhoutte 30.12.2020 14:11

Другие вопросы по теме