Как передать данные от контроллера в фоновую службу

Я пытаюсь написать простой проект веб-API с фоновой службой, выполняющей метод каждую секунду. Этот метод перебирает список и просто выводит (на данный момент) некоторую статистику. Я объявил новый список в конструкторе фонового сервиса.

В настоящее время я сталкиваюсь с некоторыми проблемами с добавлением и удалением элементов внутри контроллера.

public UsersController(IUserBackgroundService userService)
{
   private readonly IUserBackgroundService _userService;

   public UserController(IUserBackgroundService userService)
   {
       _userService = userservice;
   }

   [HttpPost]
   public IActionResult PostUser(User user)
   {
      _userService.Add(user) 
   }
}

public UserService: BackgroundService, IUserService
{
    private List<User> Users;

    public UserService()
    {
       Users = new List<Users>();
    }
    protected override ExecuteAsync(CancellationToken token)
    {
        //this will execute the GenerateUserStats every second
    }

    //this method is being executed every second 
    protected Task GenerateUserStatistics()
    {
        Console.WriteLine($"Nr. of users {users.count}");
        foreach(var user in users)
        {
            Console.WriteLine($"{user.fname} {user.sname}");
        }
    }

    //add a user to the collection
    // this is called by the PostUser method of my controller.
    public void AddUser(User user)
    {
        Users.Add(user);
    }

    public void RemoveUser(string id)
    {
        var user = Users.FirstOrDefault(u => u.Id == id);
        Users.Remove(user);
    }
}

Я ожидаю, что каждый раз, когда я вызываю PostUser(), список пользователей должен увеличиваться, и мой метод GenerateStatistics() должен выводить правильные значения, вместо этого все, что он выводит, это Nr пользователей 0.

Я зарегистрировал сервис как hostedservice и singleton. На данный момент я опустил некоторые вещи из кода, потому что у меня нет кода на этой машине.


comment
Вам нужно хранилище данных   -  person Roman Marusyk    schedule 25.09.2019


Ответы (1)


Зарегистрируйте свой backgroundService как IHostedService в ConfigureServices файла Startup.cs, как показано ниже:

 services.AddSingleton<UserService>();
 services.AddSingleton<IHostedService, UserService>(
            serviceProvider => serviceProvider.GetService<UserService>());

Затем служба внедрения зависимости в контроллере:

 public class UsersController : ControllerBase
{
    private readonly UserService _userService;

    public UsersController(UserService userService)
    {
        _userService = userService;
    }

    [HttpPost]
    public IActionResult PostUser(User user)
    {
        _userService.AddUser(user);
        return Ok();
    }
}

Ссылка: https://github.com/simpleinjector/SimpleInjector/issues/596

person Xueli Chen    schedule 26.09.2019