2010-01-20 3 views
8

J'ai lu plusieurs autres questions sur ce sujet (here, here, et here), mais je n'ai pas encore trouvé de bonne réponse. J'ai déjà développé ma juste part de couches d'accès aux données et préfère personnellement utiliser des classes d'instance au lieu de classes statiques. Cependant, il s'agit plus d'une préférence personnelle (j'aime tester mes objets métier, et cette approche permet de se moquer de la DAL plus facilement). J'ai déjà utilisé des classes statiques pour accéder à la base de données, mais j'ai toujours ressenti un peu d'insécurité quant à la pertinence d'un tel design (en particulier dans un environnement ASP.NET). Quelqu'un peut-il fournir de bons avantages/inconvénients en ce qui concerne ces deux approches pour développer des classes d'accès aux données avec les fournisseurs ADO.NET (sans ORM), dans une application ASP.NET en particulier. N'hésitez pas à vous joindre à nous si vous avez des astuces plus générales sur les classes statiques ou sur les classes d'instances.Quels sont les avantages/inconvénients de choisir entre les classes d'accès aux données statiques et d'instance dans une application Web?

En particulier, les questions qui me préoccupent sont:

  1. Threading &
  2. concurrency Évolutivité
  3. Performance
  4. Toute autre inconnues

Merci!

Répondre

10

Les approches basées sur les statiques ont généralement un seul avantage: elles sont faciles à implémenter.

instance approches basées victoire pour:

  1. Threading et Concurrency - Vous n'avez pas besoin/autant de synchronisation, de sorte que vous obtenez un meilleur débit
  2. Évolutivité - mêmes problèmes que ci-dessus
  3. Perf.- les questions mêmes que ci-dessus
  4. testabilité - ce qui est beaucoup plus facile à tester, car se moquant sur une instance est facile, et tester les classes statiques est gênant

approches statiques peuvent gagner sur:

  1. mémoire Cohérence/Partage - Il est facile de garder une seule instance cohérente avec elle-même.

En général, je pense que les approches basées sur des instances sont supérieures. Cela devient plus important si vous voulez étendre au-delà d'un seul serveur, car l'approche statique va "casser" dès que vous commencez à l'instancier sur plusieurs machines ...

+0

Je pense que les avantages l'emportent largement sur les inconvénients, au moins à mon avis. Et en ce qui concerne la consommation de mémoire, je pense que c'est probablement un inconvénient négligeable dans la plupart des applications. –

+0

@Kevin Babcock: Personnellement, j'essaie presque toujours d'utiliser des approches basées sur des instances. Si je veux/besoin de statique, je vais d'habitude à un singleton, puisque c'est plus facile de s'adapter à une approche multiton ou à une instance plus tard (puisque vous travaillez toujours avec des instances ...) –

+0

@ReedCopsey qu'en est-il pour une classe utilitaire? faire le ménage de base, comme la validation des données? –

5

Mon sentiment général est: pourquoi instancier si vous n'avez pas à le faire?

J'utilise des classes statiques quand il n'y a pas d'utilisation pour plusieurs instances et il n'y a pas besoin de membres d'instance. En ce qui concerne le DAL, le fait est qu'il n'y en a qu'un seul. Pourquoi l'instancier s'il n'y a pas de valeur?

Regardez this link, qui montre que les appels de méthodes statiques sont plus rapides que les appels de méthode de classe d'instance.

This link montre qu'un avantage de l'utilisation d'une classe statique est que le compilateur peut vérifier pour s'assurer qu'aucun membre d'instance n'est accidentellement ajouté.

This linkThis link montre qu'une classe statique peut être utilisée comme un conteneur pratique pour des ensembles de méthodes qui fonctionnent uniquement sur les paramètres d'entrée et n'ont pas besoin d'obtenir ou de définir des champs d'instance internes. Pour un DAL, c'est exactement ce que vous avez. Il n'y a aucune raison de créer des champs d'instance internes et, par conséquent, aucune raison d'instancier.

+0

Il y a beaucoup de valeur dans l'instanciation. Personnellement, je ressens exactement le contraire: Ne passez à l'état statique que s'il y a une raison impérieuse pour que le type/data/method/etc soit traité de manière statique. –

+0

Mon sentiment général est: Pourquoi le rendre statique quand vous n'en avez pas besoin? – Amy

+0

@yoda et @Reed: Vous semblez sentir que ma réponse est incorrecte. À votre avis, quels sont les inconvénients des classes statiques? –

0

J'ai utilisé un static DAL pendant des années, et je suis d'accord avec vos préoccupations. Threading et concurrence est le plus difficile et dans mon cas, je stocke différents objets de connexion dans les structures statiques de thread. Il s'est avéré très évolutif et fonctionne bien, d'autant plus maintenant que je convertis PropertyInfo en PropertyDescriptor qui me donne les mêmes avantages de la réflexion avec de meilleures performances. Dans mon DAL Je dois simplement écrire:

List<Entity> tableRows = SQL.Read(new SearchCriteria(), new Table()); 

Tout fraie de la classe statique SQL, et qui fait mon code beaucoup plus simple.

+0

Quels types de problèmes de concurrence avez-vous rencontrés avec votre approche? –

+0

Comme je l'ai configuré, j'exécute un objet de connexion par thread. Un problème de simultanéité que j'ai dû gérer était quand vous insériez un nouvel objet, obteniez sa clé primaire générée (à partir d'une séquence ou d'une identité) et remplissiez la valeur PK de l'objet - si vous ne faites pas attention, vous faites beaucoup d'insertions séquence gâcher la relation FK. –

0

Pour moi, la raison principale est que je n'ai pas besoin de garder l'état de cet objet DAL. L'état des objets qu'il utilise ne couvre pas la portée de la méthode dans laquelle ils sont intégrés. De cette façon, pourquoi garderiez-vous plusieurs instances d'un objet, si elles sont toutes les mêmes? Avec les dernières versions de l'ADO.NET, il semble préférable de créer et de détruire la connexion à la base de données dans le cadre de votre appel, et de laisser le ConnectionPool s'occuper de toute la question de la réutilisation de la connexion. Encore une fois avec les dernières versions de .NET Framework, TransactionScope (qui serait une raison pour gérer vos connexions vous-même) passer au niveau de l'entreprise, ce qui vous permet de joindre plusieurs appels à la DAL dans le même périmètre. Donc, je ne peux pas voir un cas contraignant pour créer et détruire (ou mettre en cache) des instances de la DAL.

Questions connexes