如何将数据从控制器传递到后台服务

问题描述 投票:0回答:1

我正在尝试编写一个简单的Web 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()时,Users列表都会增加,而我的GenerateStatistics()方法应打印出正确的值,而打印出的只是Nr个用户0。

我将该服务注册为托管服务和单例。我暂时不在代码中省略了一些内容,因为我在这台机器上没有代码。

c# asp.net-core asp.net-core-webapi background-service asp.net-core-hosted-services
1个回答
0
投票

将您的backgroundService注册为Startup.cs的IHostedService中的ConfigureServices,如下所示:

 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

© www.soinside.com 2019 - 2024. All rights reserved.