Envisagez la méthode FetchData
ci-dessous. Il est conçu pour éviter de dupliquer le code de requête de la base de données chaque fois que vous souhaitez récupérer des données de la base de données.Évitez la duplication de code lors de la lecture/sérialisation à partir de DbDataReader?
List<MyData> myData = new List<MyData();
FetchData((IDataReader reader) =>
{
myData.Add(new MyData(reader.GetString(0), reader.GetInt32(1)));
}, "usp_get_my_data");
Il fonctionne, mais ce serait bien si cette création d'objets pourrait en quelque sorte vivre dans la méthode FetchData
.
Y a-t-il une meilleure approche?
Peut-être que FetchData
peut être modifié pour retourner une liste d'un certain type X directement?
protected void FetchData(Action<IDataReader> processor, String query)
{
using (var connection = CreateConnection())
{
connection.ConnectionString = ConnectionString;
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = query;
using (IDataReader reader = command.ExecuteReader())
{
while (reader.read())
{
processor(reader);
}
}
}
}
}
Le problème serait que FetchData aurait besoin maintenant de choses sur l'objet qu'il va créer pour y parvenir. Pourquoi ne pas faire de la création d'objet une partie de l'objet réel (dans ce cas, MyData) en utilisant une interface quelconque et la transmettre à FetchData. –
Vous voulez dire comme une usine? Et un modèle pour permettre différents types de données? – l33t
L'action du processeur qui a été transmise à FetchData devrait alors se dérouler dans MyData onbject. –