2009-06-03 7 views
0

OK, donc j'ai quelques modules dans mon application. L'un s'appelle ProductCatalogue et l'autre s'appelle Contracts. Nous avons maintenant besoin d'un contrat associé à un certain nombre de produits (par exemple les produits qu'une partie à un contrat est autorisé à commander). Au sein du module Catalogue Catalogue produits que nous avons une classe ProductDAL qui a les fonctions suivantesComment accéder au DAL d'un autre module?

Public Function GetProducts() 
    Set GetProducts = GenerateProductsList("SOME SQL") 
End Function 

Private Function GenerateProductsList(selectQuery) 
    Dim list : Set list = New List 
    Dim results : results = GetResultsFromDB(selectQuery) 
    '... for each row 
     Dim product : Set product = New Product 
     product.Id = results(field, index) 
     list.Add(product) 
    'loop ... 
    Set GenerateProductsList = list 
End Function 

Maintenant, je veux obtenir tous les produits associés à un contrat donc je veux écrire une fonction qui ressemble à ceci

Public Function GetProductsForContract(contractId) 
    Set GetProductsForContract = GenerateProductsList("SOME SQL") 
End Function 

Ma question est, où devrais-je mettre cette fonction? Je veux utiliser la fonction GenerateProductsList() existante car elle est beaucoup plus compliquée qu'elle n'en a l'air. Là, ma question est "Où devrais-je mettre GetProductsForContract"?

Mes options:

1) Mettre en ProductDAL. Le problème avec ceci est que ProductDAL prend soudainement conscience de ce qu'est un contrat et je peux le voir remplir rapidement des fonctions telles que GetProductsForAllContracts, GetProductsForLiveContracts, etc, etc (et plus quand d'autres modules veulent accéder aux produits) donc vraiment J'aimerais garder ces fonctions avec le reste du code des contrats.

2) Mettez-le dans ContractDAL et rendre publique ProductDAL.GenerateProductsList.
Devrais-je vraiment exposer cela?

3) Créer une nouvelle classe dont une méthode qui a la seule responsabilité d'intégrer un ensemble de données SQL et de retourner une liste de produits.
En fait, n'est-ce pas la même chose que 2?

4) Arrêtez de vous tromper.
Je ne sais pas comment. Montre moi. Alors tiens moi.

edit: En outre, qu'en est-il de AddProductToContract, RemoveProductFromContract où cela va-t-il? Je penche vers une nouvelle classe ContractProductManager, mais quel est le meilleur moyen d'accéder à GenerateProductsList()

Répondre

1

Il est difficile de répondre à cette question sans en savoir plus sur votre application. Je dirais que si les produits et les contrats sont dans la même base de données et le seront toujours, avoir deux LAD semble être une séparation arbitraire. Puisque vous avez probablement déjà une relation entre le produit et le contrat dans la base de données, vous ne gagnez rien en séparant les deux dans le DAL. Vous pouvez placer cette nouvelle méthode dans l'une ou l'autre classe, imho.

+0

Merci pour votre réponse. Je n'ai qu'une seule base de données mais l'application est énorme, c'est pourquoi il y a différentes LAD pour différentes sections (produit, contrats, contacts, documents, etc.). – jammus

Questions connexes