2 回答

TA貢獻1797條經驗 獲得超6個贊
您應該在TimedHostedServices觸發時創建一個范圍。
在構造函數中注入服務提供者:
public MyServiceService(IServiceProvider services)
{
_services = services;
}
然后在任務觸發時創建一個范圍
using (var scope = _services.CreateScope())
{
var anotherService = scope.ServiceProvider.GetRequiredService<AnotherService>();
anotherService.Something();
}
文檔中提供了更完整的示例

TA貢獻1877條經驗 獲得超1個贊
另一種創建自己的 DbContextFactory 并為每個查詢實例化新實例的方法。
public class DbContextFactory
{
public YourDbContext Create()
{
var options = new DbContextOptionsBuilder<YourDbContext>()
.UseSqlServer(_connectionString)
.Options;
return new YourDbContext(options);
}
}
用法
public class Service
{
private readonly DbContextFactory _dbContextFactory;
public Service(DbContextFactory dbContextFactory)
=> _dbContextFactory = dbContextFactory;
public void Execute()
{
using (var context = _dbContextFactory.Create())
{
// use context
}
}
}
使用工廠,您無需再擔心范圍,并使您的代碼擺脫 ASP.NET Core 依賴項。
您將能夠異步執行查詢,這對于沒有變通辦法的范圍 DbContext 是不可能的。
您始終對調用時保存的數據充滿信心.SaveChanges(),其中使用作用域 DbContext 可能會在其他類中更改某些實體。
- 2 回答
- 0 關注
- 317 瀏覽
添加回答
舉報