首先,让我们看看微软对Asp.Net Core的默认依赖注入服务的看法:
该框架负责创建依赖项实例,并在不再需要它时将其处置。
即框架将调用类Dispose方法(假设该类实现IDisposable)
其次,DbContext类确实确实实现了IDisposable。
第三,在我们的Startup.cs类中,我们通过AddDbContext方法添加DbContext,默认情况下,该方法将作为Scoped实例添加(即,我们的DbContext被创建并在每个单个请求上进行垃圾回收)。
每个请求一次创建范围的生命周期服务。
例如
public void ConfigureServices(IServiceCollection services)
{
services
.AddDbContext<TheStoreDbContext>(ConfigureDbContext)
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
}
Run Code Online (Sandbox Code Playgroud)
结论,我们不需要在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();
}
}
Run Code Online (Sandbox Code Playgroud)
你怎么看?这是一个有效的问题吗?不在任何地方显式调用Dispose()方法是否有意义?