【发布时间】:2017-10-27 19:53:10
【问题描述】:
我已经使用 ASP.NET Core 构建了一个 API 服务。就像任何其他 API 一样,这个 API 必须从数据库中检索一些数据,应用一些业务逻辑,然后将数据发送回客户端。
首先,我有使用 Entity Framework.Core 搭建的 EmployeeDataContext 类。该类派生自Microsoft.EntityFrameworkCore.DbContext,如下所示。
public partial class EmployeeDataContext : DataContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
......
}
}
该数据上下文类在数据提供者类中使用如下。
public class EmployeeDataProvider : IEmployeeDataProvider, IDisposable
{
private EmployeeDataContext dataContext;
public EmployeeDataProvider(EmployeeDataContext context)
{
this.dataContext = context;
}
// Various CRUD methods
// Dispose
public void Dispose()
{
if ( this.dataContext != null )
{
this.dataContext.Dispose();
}
}
}
服务层持有对数据提供者的引用,如下所示。
public class EmployeeService : IEmployeeService
{
private IEmployeeDataProvider dataProvider;
public EmployeeService(IEmployeeDataProvider dataProvider)
{
DataProvider = dataProvider;
}
// Add/Delete/Update Employee related calls
}
所有的依赖都注入到Startup类中,如下所示。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IEmployeeDataProvider, EmployeeDataProvider>();
services.AddScoped<IEmployeeService, EmployeeService>();
}
}
根据微软doc
容器将为它创建的 IDisposable 类型调用 Dispose。
这意味着 EmployeeDataProvider.Dispose() 方法将在请求生命周期结束时被容器调用。
我的问题是关于如何为 EmployeeDataProvider 类实现 IDisposable。 link 提供了在各种情况下实现 IDisposable 的最佳实践,这些场景可能还需要您实现 Disposable(bool)。但是,对于这种情况,我不确定是否 所需的一切和我当前(简单)的 Dispose 实现已经足够好了,因为(因为这里不涉及通过终结器的调用)。对于这种情况,我的理解和 IDisposable 看起来是否正确?
【问题讨论】:
-
如果您的班级是
sealed,则不需要virtual Dispose(Boolean disposing)方法。如果它是密封的,你只需要一个非虚拟的(如果你的类是子类,则覆盖)Dispose方法,不带任何参数。
标签: dependency-injection asp.net-core .net-core idisposable asp.net-core-webapi