.NET 核心中 IDisposable 类 的依赖注入生命周期
dependency injection life cycle for IDisposable classes in .NET core
我想知道,请求完成后处理所有 IDisposable 对象的最佳方法是什么。
AddTransient<T>
- 添加每次重新创建的类型
请求。
AddScoped<T>
- 添加为请求范围保留的类型。
AddSingleton<T>
- 在第一次请求时添加类型并保留
抓住它。
因此,单例不是一个好的选择,因为它会在应用程序被击落后进行处理。但是 scope 和 transient 是不错的选择。我有一个存储库,我想像这样与我的数据库建立连接:
public class Dapperr : IDapper
{
private readonly IConfiguration _config;
private string Connectionstring = "DefaultConnection";
public Dapperr(IConfiguration config)
{
_config = config;
}
public void Dispose()
{
}
public T Get<T>(string sp, DynamicParameters parms, CommandType commandType = CommandType.Text)
{
using IDbConnection db = new SqlConnection(_config.GetConnectionString(Connectionstring));
return db.Query<T>(sp, parms, commandType: commandType).FirstOrDefault();
}
public List<T> GetAll<T>(string sp, DynamicParameters parms, CommandType commandType = CommandType.StoredProcedure)
{
using IDbConnection db = new SqlConnection(_config.GetConnectionString(Connectionstring));
return db.Query<T>(sp, parms, commandType: commandType).ToList();
}
}
现在,在我的启动中,我将添加依赖注入:
services.AddScoped<IDapper, Dapperr>();
我想知道我是否可以删除所有这些 using
范围,因为添加了范围依赖性。 例如:
public class Dapperr : IDapper
{
private readonly IConfiguration _config;
private string Connectionstring = "DefaultConnection";
private readonly IDbConnection db ;
public Dapperr(IConfiguration config)
{
_config = config;
db = new SqlConnection(_config.GetConnectionString(Connectionstring));
}
public T Get<T>(string sp, DynamicParameters parms, CommandType commandType = CommandType.Text)
{
return db.Query<T>(sp, parms, commandType: commandType).FirstOrDefault();
}
public List<T> GetAll<T>(string sp, DynamicParameters parms, CommandType commandType = CommandType.StoredProcedure)
{
return db.Query<T>(sp, parms, commandType: commandType).ToList();
}
}
sql 连接是在请求结束后处理还是我仍然需要使用 using
?
阅读我得到的评论后,我必须将接口设置为 IDisposable
来处理连接,所以我更改了我的代码:
public interface IDapper : IDisposeable
{
...
}
然后在我的 repo 中,我实现了 dispose 方法:
public class Dapperr : IDapper
{
private readonly IConfiguration _config;
private string Connectionstring = "DefaultConnection";
private readonly IDbConnection db;
public Dapperr(IConfiguration config)
{
_config = config;
db = new SqlConnection(_config.GetConnectionString(Connectionstring));
}
public T Get<T>(
string sp,
DynamicParameters parms,
CommandType commandType = CommandType.Text)
{
return db.Query<T>(sp, parms, commandType: commandType).FirstOrDefault();
}
public List<T> GetAll<T>(string sp, DynamicParameters parms) =>
db.Query<T>(sp, parms, commandType: commandType).ToList();
public void Dispose()
{
db?.dispose();
}
}
调试后,我看到调用了这个 Dispose
方法并处理了连接。我不确定这是最佳做法,但通过这些更改,我只编写了一次连接配置,我的所有 using
块都被删除了。我认为这对于轻度请求会很好。
我想知道,请求完成后处理所有 IDisposable 对象的最佳方法是什么。
AddTransient<T>
- 添加每次重新创建的类型 请求。AddScoped<T>
- 添加为请求范围保留的类型。AddSingleton<T>
- 在第一次请求时添加类型并保留 抓住它。
因此,单例不是一个好的选择,因为它会在应用程序被击落后进行处理。但是 scope 和 transient 是不错的选择。我有一个存储库,我想像这样与我的数据库建立连接:
public class Dapperr : IDapper
{
private readonly IConfiguration _config;
private string Connectionstring = "DefaultConnection";
public Dapperr(IConfiguration config)
{
_config = config;
}
public void Dispose()
{
}
public T Get<T>(string sp, DynamicParameters parms, CommandType commandType = CommandType.Text)
{
using IDbConnection db = new SqlConnection(_config.GetConnectionString(Connectionstring));
return db.Query<T>(sp, parms, commandType: commandType).FirstOrDefault();
}
public List<T> GetAll<T>(string sp, DynamicParameters parms, CommandType commandType = CommandType.StoredProcedure)
{
using IDbConnection db = new SqlConnection(_config.GetConnectionString(Connectionstring));
return db.Query<T>(sp, parms, commandType: commandType).ToList();
}
}
现在,在我的启动中,我将添加依赖注入:
services.AddScoped<IDapper, Dapperr>();
我想知道我是否可以删除所有这些 using
范围,因为添加了范围依赖性。 例如:
public class Dapperr : IDapper
{
private readonly IConfiguration _config;
private string Connectionstring = "DefaultConnection";
private readonly IDbConnection db ;
public Dapperr(IConfiguration config)
{
_config = config;
db = new SqlConnection(_config.GetConnectionString(Connectionstring));
}
public T Get<T>(string sp, DynamicParameters parms, CommandType commandType = CommandType.Text)
{
return db.Query<T>(sp, parms, commandType: commandType).FirstOrDefault();
}
public List<T> GetAll<T>(string sp, DynamicParameters parms, CommandType commandType = CommandType.StoredProcedure)
{
return db.Query<T>(sp, parms, commandType: commandType).ToList();
}
}
sql 连接是在请求结束后处理还是我仍然需要使用 using
?
阅读我得到的评论后,我必须将接口设置为 IDisposable
来处理连接,所以我更改了我的代码:
public interface IDapper : IDisposeable
{
...
}
然后在我的 repo 中,我实现了 dispose 方法:
public class Dapperr : IDapper
{
private readonly IConfiguration _config;
private string Connectionstring = "DefaultConnection";
private readonly IDbConnection db;
public Dapperr(IConfiguration config)
{
_config = config;
db = new SqlConnection(_config.GetConnectionString(Connectionstring));
}
public T Get<T>(
string sp,
DynamicParameters parms,
CommandType commandType = CommandType.Text)
{
return db.Query<T>(sp, parms, commandType: commandType).FirstOrDefault();
}
public List<T> GetAll<T>(string sp, DynamicParameters parms) =>
db.Query<T>(sp, parms, commandType: commandType).ToList();
public void Dispose()
{
db?.dispose();
}
}
调试后,我看到调用了这个 Dispose
方法并处理了连接。我不确定这是最佳做法,但通过这些更改,我只编写了一次连接配置,我的所有 using
块都被删除了。我认为这对于轻度请求会很好。