[英]How to pass data from a controller to a background service
我正在嘗試編寫一個簡單的 web api 項目,后台服務每秒執行一個方法。 此方法循環遍歷列表並僅打印出(目前)一些統計信息。 我在后台服務的構造函數中聲明了一個新列表。
我目前在 controller 內部添加和刪除項目時遇到了一些問題。
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 的 Nr。
我將該服務注冊為托管服務和 singleton。 我暫時從代碼中省略了一些東西,因為我在這台機器上沒有代碼。
在 Startup.cs 的ConfigureServices
中將您的 backgroundService 注冊為IHostedService
,如下所示:
services.AddSingleton<UserService>();
services.AddSingleton<IHostedService, UserService>(
serviceProvider => serviceProvider.GetService<UserService>());
然后在 controller 中依賴注入服務:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.