Аспект метода C# Metalama не получает внедряемые свойстваC#

Место общения программистов C#
Anonymous
Аспект метода C# Metalama не получает внедряемые свойства

Сообщение Anonymous »

Я пытаюсь реализовать версию примера Metalama Retry 5 в нашем приложении в качестве первого шага, чтобы увидеть, будет ли Metalama полезна для наших случаев использования. Однако у меня возникла проблема с полями [IntroduceDependency]; похоже, они не внедряются, хотя для них настроен DI.
Для RetryAttribute у меня есть (этот класс находится в общей библиотеке классов, поскольку решение имеет несколько проектов, которые должны иметь возможность его использовать):

Код: Выделить всё

public class RetryAttribute : OverrideMethodAspect
{
[IntroduceDependency]
private readonly ILogger _logger;

[IntroduceDependency]
private readonly IResiliencePipelineFactory _resiliencePipelineFactory;

[IntroduceDependency]
private readonly IRetryHttpConfiguration _retryHttpConfiguration;

public StrategyKind Kind { get; }

public RetryAttribute(StrategyKind kind)
{
Kind = kind;
}

public override dynamic? OverrideMethod() { ... }

public override async Task OverrideAsyncMethod() { ... }
}
И в классе Startup приложения я настраиваю DI:

Код: Выделить всё

services.AddSingleton(_ => Log.Logger);
services.AddSingleton(dataflowConfiguration.RetryHttpConfiguration);
services.AddSingleton();
Я пытаюсь использовать этот атрибут в классе ApiClient следующим образом:

Код: Выделить всё

public class ApiClient(ILogger logger, HttpClient httpClient)
{
public async Task SendMessagesToClient(IEnumerable messages)
{
using (var request = CreateDefaultRequestMessageWithCustomData())
{
// Setup `request` properties

response = await SendMessageWithRetry(request);

// Process `response`
}
}

[Retry(StrategyKind.RetryWithFallback)]
private async Task SendMessageWithRetry(HttpRequestMessage request)
{
var response = await _httpClient.SendAsync(request);
return response;
}
Однако, когда я пытаюсь создать экземпляр ApiClient (например, var apiClient = new ApiClient(logger, httpClient);): я получаю следующее исключение:

Код: Выделить всё

- Message: Value cannot be null. (Parameter 'resiliencePipelineFactory')
- Stack Trace:    at Company.Product.Shared.ApiClients.ApiClient..ctor(ILogger logger, HttpClient httpClient, IResiliencePipelineFactory resiliencePipelineFactory, IRetryHttpConfiguration retryHttpConfiguration)
at Company.Product.Shared.Helpers.Helper.CreateApiClient(ILogger logger, IConfidentialClientApplication confidentialClient) in C:\Product\Company\Product\Company.Product\src\Company.Product.Shared\Helpers\Helper.cs:line 55
Я просмотрел все решение, чтобы убедиться, что единственная переменная с именем resiliencePipelineFactory находится в классе RetryAttribute.
Кроме того, в сообщении об исключении показаны 4 параметра для класса ApiClient (, HttpClient, IResiliencePipelineFactory и IRetryHttpConfiguration), даже думал, что я определил только первые два. Я предполагаю, что два других добавлены Metalama, поскольку они необходимы для RetryAttribute, но тогда как мне создать новый экземпляр ApiClient?
Нужно ли мне явно определять два дополнительных параметра (т. е. IResiliencePipelineFactory и IRetryHttpConfiguration) в конструкторе ApiClient? Если да, то как их следует хранить/передавать в RetryAttribute, поскольку сам класс ApiClient не использует эти два параметра?
Это моя первая попытка использования Metalama, поэтому я, вероятно, упускаю/неправильно понимаю что-то базовое, поэтому буду очень признателен за любую помощь/руководство.

Подробнее здесь: https://stackoverflow.com/questions/798 ... properties

Вернуться в «C#»