Quiero saber cuál es la mejor manera de desechar todo el objeto IDisposable después de realizar la solicitud.
AddTransient<T> : agrega un tipo que se vuelve a crear cada vez que se solicita.AddScoped<T> : agrega un tipo que se mantiene para el alcance de la solicitud.AddSingleton<T> : agrega un tipo cuando se solicita por primera vez y lo conserva.Por lo tanto, singleton podría no ser una buena opción porque se desechará después de que la aplicación se cierre. pero el alcance y el transitorio son buenos candidatos. Tengo un repositorio en el que quiero crear una conexión con mi base de datos de esta manera:
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(); } }Ahora, en mi puesta en marcha, voy a agregar una inyección de dependencia:
services.AddScoped<IDapper, Dapperr>(); Quiero saber si puedo eliminar a todos aquellos que using scop debido a la adición de dependencia de alcance. por ejemplo asi:
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(); } } ¿La conexión sql se elimina después de que finaliza la solicitud o todavía necesito usar using ?
Después de leer los comentarios obtuve eso, tengo que configurar la interfaz como IDisposable para eliminar la conexión, así que cambié mi código de esta manera:
public interface IDapper : IDisposeable { ... }luego, en mi repositorio, implementé el método de eliminación:
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(); } } Después de la depuración, vi que se llama a este método Dispose y se elimina la conexión. No estoy seguro de que esta sea la mejor práctica, pero con estos cambios solo escribí la configuración de conexión una vez y todos mis bloques using se eliminaron. Creo que esto sería bueno para solicitudes ligeras.