Est-il possible de placer un appel d'initialisation de base de données dans un constructeur C #? [fermé]

StackOverflow https://stackoverflow.com/questions/159886

  •  03-07-2019
  •  | 
  •  

Question

J'ai vu qu'il s'agissait de plusieurs bases de code et je voulais savoir si cela était généralement mal vu ou non.

Par exemple:

public class MyClass
{
   public int Id;

   public MyClass()
   {
      Id = new Database().GetIdFor(typeof(MyClass));
   }
}
Était-ce utile?

La solution

Il existe plusieurs raisons pour lesquelles cette conception n’est généralement pas considérée comme bonne, certaines d’entre elles pouvant entraîner des tests unitaires difficiles et des difficultés de traitement des erreurs ayant déjà été mentionnées.

La raison principale pour laquelle j’ai choisi de ne pas le faire est que votre objet et la couche d’accès aux données sont maintenant très étroitement couplés, ce qui signifie que toute utilisation de cet objet en dehors de sa conception originale nécessite des modifications importantes. Par exemple, si vous rencontriez une instance dans laquelle vous deviez utiliser cet objet sans aucune valeur attribuée à cette instance pour conserver une nouvelle instance de cette classe? vous devez maintenant soit surcharger le constructeur, puis vous assurer que toute votre autre logique gère ce cas, ou hériter et remplacer.

Si l'objet et l'accès aux données étaient découplés, vous pouvez créer une instance et ne pas l'hydrater. Ou si vous avez un projet différent qui utilise les mêmes entités mais utilise une couche de persistance différente, les objets sont réutilisables.

Cela dit, j’ai emprunté la voie plus facile du couplage dans les projets:)

Autres conseils

Bien… je ne le ferais pas. Mais là encore, mon approche implique généralement que la classe ne soit PAS responsable de la récupération de ses propres données.

Cela rendra également difficile la rédaction de tests unitaires pour la classe, car vous ne pourrez pas forcer celle-ci à utiliser une version factice / stub de la classe db. Vois ici: http://fr.wikipedia.org/wiki/Dépendency_injection

Vous pouvez utiliser le modèle jetable si vous vous référez à une connexion à une base de données:

public class MyClass : IDisposable
{
    private Database db;
    private int? _id;

    public MyClass()
    {
        db = new Database();
    }

    public int Id
    {
        get
        {
            if (_id == null) _id = db.GetIdFor(typeof(MyClass));
            return _id.Value;
        }
    }

    public void Dispose()
    {
        db.Close();
    }
}

Utilisation:

using (var x = new MyClass()) 
{
    /* ... */

} //closes DB by calling IDisposable.Dispose() when going out of "using" scope

Oui, vous POUVEZ le faire, mais ce n'est pas la meilleure conception, et la gestion des erreurs dans les constructeurs n'est pas aussi ordonnée qu'ailleurs.

Le seul problème que je puisse imaginer avec cette approche est que toute erreur provenant de l'initialisation de la base de données sera propagée en tant qu'exception du constructeur.

Pourquoi est-ce que quelqu'un voudrait utiliser un objet fictif / un bout au lieu de la chose réelle? Accepteriez-vous que les constructeurs automobiles devraient utiliser des modèles en carton? pour les crash tests?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top