如何将数据从控制器传递到后台服务
How to pass data from a controller to a background service
我正在尝试编写一个简单的 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() 时,用户列表应该增加并且我的 GenerateStatistics() 方法应该打印出正确的值,而不是它打印出的所有用户数 0。
我将该服务注册为托管服务和单例。
我暂时从代码中省略了一些东西,因为我没有代码在这台机器上。
在 Startup.cs 的 ConfigureServices
中将您的 backgroundService 注册为 IHostedService
,如下所示:
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
我正在尝试编写一个简单的 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() 时,用户列表应该增加并且我的 GenerateStatistics() 方法应该打印出正确的值,而不是它打印出的所有用户数 0。
我将该服务注册为托管服务和单例。 我暂时从代码中省略了一些东西,因为我没有代码在这台机器上。
在 Startup.cs 的 ConfigureServices
中将您的 backgroundService 注册为 IHostedService
,如下所示:
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