J'essaie d'écrire un wrapper pour cacher une grande partie du code que je me retrouve à répéter pour chaque appel de base de données dans Dapper. (à savoir la connexion SQL, essayez, attrape par défaut et enfin) Je voudrais essentiellement faire quelque chose comme le code suivant mais je comprends que parce qu’il ya un paramètre dynamique, je ne peux pas utiliser les génériques de cette façon.
La façon dont je reçois l'erreur:
Envisagez de convertir les arguments dynamiques ou d'appeler la méthode d'extension sans la syntaxe de la méthode d'extension (en référence à la méthode conn.Query)
Y a-t-il un moyen de refactoriser mon ExecuteQuery
ou quelque chose comme ça qui fonctionne?
public abtract class IDbAccessService
{
public LogService Logger { get; set; }
public virtual IEnumerable<T> ExecuteQuery<T>(string sql, dynamic param, string connString)
where T : BaseModel
{
using (var conn = DataAccessHelpers.GetOpenConnection(connString))
{
try
{
return conn.Query<T>(sql, param).ToList<T>();
}
catch (Exception ex)
{
Logger.Logger.Error(ex.Message, ex);
throw ex;
}
}
}
}
Les méthodes d'extension ne peuvent pas être distribuées dynamiquement. Donc appelez-le sans syntaxe de la méthode d'extension:
static IEnumerable<T> ExecuteQuery<T>(string sql, dynamic param, string connStr)
where T : BaseModel
{
using (var conn = DataAccessHelpers.GetOpenConnection(connStr))
{
return SqlMapper.Query(conn, sql, param).ToList<T>();
}
}
En outre, vous avez une journalisation inutile qui crée plusieurs entrées de journal pour une seule erreur et une suppression de connexion inutile (elle est effectuée automatiquement en utilisant block).
Conseils pour la gestion des exceptions:
J'ai essayé de créer des méthodes d'assistance comme ci-dessous.
private SqlConnection GetSqlConnection()
{
var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["con1"].ConnectionString);
sqlConnection.Open();
return sqlConnection;
}
public IEnumerable<T> GetAll<T>(string query, object cmdParams = null, CommandType cmdType = CommandType.Text) where T : class
{
IEnumerable<T> objList;
using (var conn = GetSqlConnection())
{
objList = conn.Query<T>(query, param: cmdParams, commandTimeout:0, commandType: cmdType);
conn.Close();
}
return objList;
}
public IEnumerable<dynamic> Query(string query, object cmdParams = null, CommandType cmdType = CommandType.Text)
{
IEnumerable<dynamic> objDyn;
using (var conn = GetSqlConnection())
{
objDyn = conn.Query(query, cmdParams, commandTimeout: 0, commandType: cmdType);
conn.Close();
}
return objDyn;
}
D'un autre calque:
var param = new DynamicParameters();
param.Add("@name", name);
var objGroupsList = _iDapper.GetAll<CustomerDTO>("dbo.GetCustomersList", param, CommandType.StoredProcedure).ToList();