У меня есть простая размещенная служба (называемая TransactionService
) в приложении .net core web api.У меня проблемы с заполнением списка в TransactionService
В моем TransactionController
я использую следующий метод для добавления транзакции:
public IActionResult CreateTransaction(Transaction transaction)
{
// validate
var _transactionS= (TransactionService)_transactionService.Service;
_transactionS.Add(transaction);
return Ok();
}
И в моем TransactionService
class:
private List<Transaction> transactions = new List<Transaction>();
public void AddTransaction(Transaction transaction)
{
transactions.Add(transaction);
}
protected override Task FilterTransactions()
{
foreach(var item in transactions)
{
//Do some work
}
return Task.CompletedTask;
}
}
Поэтому, когда я вызываю CreateTransaction
в моем контроллере, это вызывает метод AddTransaction
в моем классе обслуживания.
Метод FilterTransaction
выполняется каждый раз5 секунд, просмотрите каждый элемент моего списка и проверьте некоторые условия, единственная проблема в том, что мой список транзакций пуст.
Если я добавлю точку останова в моем AddTransactionMethod
, он покажет мне правильный счет, ноточка останова в моем операторе foreach будет показывать счетчик 0.
Это код класса Startup
для регистрации службы
services.AddHostedService<TransactionService>();
services.AddSingleton<IHostedServiceAccessor<ITransactionService>, HostedServiceAccessor<ITransactionService>>();
И настройки TransactionService:
public interface IHostedServiceAccessor<out T> where T : IHostedService
{
T Service { get; }
}
public class HostedServiceAccessor<T> : IHostedServiceAccessor<T> where T : IHostedService
{
public HostedServiceAccessor(IEnumerable<IHostedService> hostedServices)
{
Service = hostedServices.OfType<T>().FirstOrDefault();
}
public T Service { get; }
}
public interface ITransactionService: IHostedService
{
}
internal class TransactionService : TransactionServiceBase, ITransactionService
{
private List<Transaction> transactions = new List<Transaction>();
public TransactionService()
:base(TimeSpan.FromMilliseconds(5000))
{
}
public void AddTransaction(Transaction transaction)
{
transactions.Add(transaction);
}
protected override Task FilterTransactions()
{
foreach (var item in transactions)
{
//Do some work
}
return Task.CompletedTask;
}
}
Класс TransactionServiceBase
наследует форму BackgroundService и является DLL.Он имеет абстрактный метод FilterTransaction и еще один запечатанный ExecuteAsync ()