Utiliser des méthodes statiques pour s'interfacer avec une base de données - des problèmes potentiels?

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

Question

Je regarde un accès de base de données de gestion de classe pour une application MVC3 / .NET.

La classe est statique et fournit de belles méthodes de commodité pour les requêtes DB courantes - toutes sortes de trucs twiddly comme "getColumnBValueforColumna ()", ainsi que des requêtes beaucoup plus complexes. Il est joliment pris en compte / optimisé pour la solution et le domaine donnés.

Voir la classe comme statique, cependant, a déclenché un souvenir à moitié oublié sur la façon dont cela pourrait être une mauvaise idée (peut-être dans le contexte du multi-threading?), Et je ne peux pas secouer le sentiment.

Est-ce une bonne idée de garder ce type de classe statique, ou devrais-je l'instancier pour chaque appel de base de données?

Était-ce utile?

La solution

Est-ce une bonne idée de garder ce type de classe statique, ou devrais-je l'instancier pour chaque appel de base de données?

Si vous vous souciez des choses comme un couplage faible entre les couches de votre application, la réutilisabilité de ces couches, les tests unitaires isolément, vous ne devriez faire aucun des éléments ci-dessus. Vous devriez travailler avec des abstractions.

Si vous ne vous souciez pas de ces choses, les méthodes statiques sont très bien. La seule chose à faire attention lorsque vous travaillez avec des méthodes statiques est de les concevoir afin qu'ils soient réentrant Et ne dépendez pas d'un état partagé pour être sûr. Dans tous les cas, assurez-vous de disposer correctement toutes les ressources iDisposables telles que les connexions et les commandes de la base de données en les emballant en utilisant des instructions.

Autres conseils

Est-ce une bonne idée de garder ce type de classe statique, ou devrais-je l'instancier pour chaque appel de base de données?

Ce ne sont pas vos deux seules options.

La classe devrait ne pas Soyez statique: en le rendant statique vous abandonnez quelques avantages importants de programmation orientée objet, tout en gagnant pratiquement rien.

Au lieu de cela, une instance doit être fournie à vos contrôleurs via l'injection de dépendance basée sur le constructeur. Que la classe soit réinstanticiée pour chaque demande ou si vous finissiez par utiliser un singleton est alors déterminé par votre code de liaison à la division. Vous pouvez le changer à la goutte d'un chapeau.

Voici quelques avantages:

  1. Supposons que vous souhaitez tester unité de la méthode qui repose sur cette classe d'accès de données. Si vous utilisez un Interface de service injectée Plutôt que d'appeler directement une méthode statique, vous pouvez créer un objet simulé, lui dire comment se comporter et permettre à la méthode que vous testez un unité de pensée qu'il obtient des données réelles alors qu'en fait, vous lui donnez simplement les données que vous souhaitez test.
  2. Dites que vous finissez par vouloir mettre en cache les résultats de vos appels d'accès aux données. Vous pouvez injecter une classe de mise en cache qui enveloppe la classe réelle, renvoyant les résultats mis en cache dans la mesure du possible et invoquant les méthodes réelles d'accès aux données lorsque les valeurs en cache ne sont pas présentes. Rien de tout cela ne nécessiterait de modifications apportées à votre classe d'accès aux données.

Je pourrais continuer. Les classes statiques tuent votre flexibilité et n'ont aucun avantage pratique 99% du temps.

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