Contourner les arguments génériques et dynamiques

c# dapper dynamic service-layer

Question

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;
         }
      }
   }
}

Réponse acceptée

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:

  • Gérer les exceptions et les enregistrer
  • Enroulez une exception dans une exception de haut niveau et lancez ce wrapper (l'appelant gérera cette exception de haut niveau ou l'enverra également)
  • Ne pas intercepter l'exception (l'appelant fera la première ou la deuxième option)

Réponse populaire

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();



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi