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 关注
- 115 浏览
添加回答
举报