首先,让我们看看微软关于Asp.Net Core默认依赖注入服务的说法:
框架负责创建依赖项的实例,并在不再需要时处理它。
也就是说,框架将调用类的Dispose方法(假设该类实现了IDisposable接口)。
其次,DbContext类确实从一开始就实现了IDisposable接口。
第三,在我们的Startup.cs类中,我们通过AddDbContext方法添加我们的DbContext,默认情况下,它作为Scoped实例添加(即我们的DbContext在每个单独请求上都会被创建和垃圾回收)。
Scoped生命周期服务是每个请求创建一次。
例如:
public void ConfigureServices(IServiceCollection services)
{
services
.AddDbContext<TheStoreDbContext>(ConfigureDbContext)
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
}
结论,在我们的Asp.net Core应用程序中,我们不需要显式调用context.Dispose()。
那为什么在线教程和教程中有这么多例子,告诉你必须在Repository或UnitOfWork类中实现IDisposable呢?
例如:
public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _context;
public IProductRepository ProductRepository { get; }
public UnitOfWork(DbContext context)
{
_context = context;
ProductRepository = new ProductRepository(context);
}
public void Dispose()
{
_context.Dispose();
}
}
你认为呢?这是一个有效的问题吗?不在显式调用Dispose()方法有意义吗?
IDisposable
来释放资源是很好的做法。将清理交给框架是一种良好的实践吗?在C++中可以这么做吗?其实不然,随着时间推移,你会遇到问题。 - ColinM