2010-04-22 29 views
0

J'ai un BaseDataClass avec des champs partagés et lesune classe de base avec des champs partagés et les bonne conception

Protected Shared dbase as SqlDatabase 
    Protected Shared dbCommand as DBCommand 
    ... 
    //also have a sync object used by the derived classes for Synclock'ing 
    Protected Shared ReadOnly syncObj As Object = New Object() 

    Protected Shared Sub Init() //initializes fields, sets connections 
    Protected Shared Sub CleanAll() //closes connections, disposes, etc. 

J'ai plusieurs classes qui dérivent de cette classe de base. Les classes dérivées ont toutes les fonctions Shared qui peuvent être appelées directement à partir de la BLL sans instanciation.
Les fonctions de ces classes dérivées appellent la base Init(), appellent leurs procédures stockées spécifiques, appellent la base CleanAll() et renvoient les résultats.

Donc si j'ai 5 classes dérivées avec 10 fonctions chacune, totalisant 50 appels de fonction possibles, puisqu'ils sont tous Shared, le CLR n'appelle qu'un seul à la fois, n'est-ce pas? Tous les appels sont mis en file d'attente pour attendre que chaque fonction Shared soit terminée.

Y a-t-il une meilleure conception avec des fonctions Shared dans votre DAL et des fonctions de classe de base? Ou puisque j'ai une classe de base, est-il préférable de se déplacer vers des méthodes d'instance au sein de la DAL?

Répondre

0

Dans ce cas particulier, je dirais non. Ce n'est pas un bon design. Pour que cela fonctionne correctement, chaque appel de méthode sur chaque classe doit d'abord acquérir un verrou sur syncObj afin de ne pas corrompre l'état en raison de plusieurs threads en compétition pour la même ressource. En ignorant les impacts potentiels sur les performances qui peuvent en résulter, vous ne seriez pas en mesure de faire fonctionner vos classes dérivées de manière indépendante, car elles utilisent toutes le même "truc".

Je recommande fortement de pousser vers des méthodes d'instance dans ce cas. Si vous voulez toujours que votre classe individuelle utilise la même SqlConnection ou autre, passez-la dans la classe en utilisant l'injection de dépendance.