J'ai fait quelques recherches avant de poster cette question. Parmi d'autres questions ou messages, l'une d'entre elles est fournie ci-dessous. Je ne pouvais pas savoir clairement comment déterminer ..
Objets métier dans une couche d'accès aux données
J'ai un référentiel et les couches métier appellent le référentiel pour récupérer les données. Par exemple, disons que j'ai les classes suivantes pour BLL et DAL:
class BllCustomer
{
public int CustomerId {get; set;}
public String Name {get; set;}
public BllAddress Address {get; set;}
}
class BllAddress
{
public int AddressId {get; set;}
public String Street {get; set;}
public String City {get; set;}
public String ZipCode {get; set; }
}
class DalCustomer
{
public int CustomerId {get; set;}
public String Name {get; set;}
public int AddressID {get; set;}
}
class DalAddress
{
public int AddressId {get; set;}
public String Street {get; set;}
public String City {get; set;}
public String ZipCode {get; set; }
}
Si le BLL veut récupérer un objet Customer, il appellera GetCustomerById (customerId) dans DAL.
Voici mes préoccupations, je ne pouvais pas avoir un esprit clair:
Je ne vois pas comment déterminer quel objet le GetCustomerById dans DAL doit retourner? Doit-il renvoyer BllCustomer ou DalCustomer?
Où devrait être la récupération (et / ou la conversion en objet métier) de l'adresse associée au client?
Si le DAL renvoie des objets Dal alors, la logique pour récupérer et remplir l'adresse ne peut être que dans le BLL. Si le DAL renvoie des objets BLL, alors la logique pour récupérer et remplir l'adresse peut être soit dans le BLL soit dans le DAL. Actuellement, le DAL renvoie les objets métier et la logique pour le remplir se trouve dans le DAL.
D'après ce que j'ai lu, je suppose qu'il n'y a pas de bien ou de mal. Du lien inclus ci-dessus, il y a des gens qui disent dans un sens et les autres disent dans l'autre sens. Mais comment puis-je déterminer ce qui fonctionnerait le mieux pour mon cas?
Toute aide serait appréciée.
la source
Réponses:
Il doit renvoyer un objet DalCustomer , le retour d'un objet BllCustomer rompra le principe de responsabilité unique . Vous pouvez afficher l' objet DalCustomer en tant qu'interface ou contrat consommé par la couche métier (ou consommateur). En effet, s'il renvoyait un BllCustomer, le DAL devrait répondre à chaque objet de couche métier qui l'appelle ou pourrait l'appeler.
La conversion doit être effectuée dans un modèle de vue ou un gestionnaire. Vous devez avoir un intermédiaire pour appeler votre service ou composant d'accès aux données. Si vous en ressentez le besoin, vous pouvez avoir une conversion dans votre objet BllCustomer . Mais lorsque vous échangez votre DAL de MSSQL vers Oracle par exemple, votre objet (ou interface) retourné doit rester le même.
De préférence, votre couche métier doit également être indépendante de votre couche de données. La couche métier est responsable de vos règles métier. C'est ici que vous ajouterez vos validations à l'aide d'un cadre de validation pour appliquer vos règles métier.
la source
Votre référentiel doit renvoyer l'objet BLL ou domaine. il est probable que vous n'ayez pas du tout besoin d'un objet DAL.
la source
Customer
?En règle générale, le DAL n'a aucune connaissance du BLL. Pensez-y de cette façon, une application différente avec un BLL différent pourrait utiliser le même DAL. Une application / module Payables et une application Receivables pour la même entreprise partageraient des données (clients, frais, paiements, etc.). Essayer d'avoir une DLL ayant connaissance de plusieurs BLL serait très difficile et inutile. Cela vous permettrait également de modifier votre stockage de données sans impact sur le BLL (tant que vous ne rompez pas les interfaces).
Vous pouvez maintenant passer un objet DAL au BLL ou vous pouvez créer un troisième ensemble d'objets: Entité. Celles-ci ne contiendraient que les valeurs à transmettre ensemble. Le DAL ferait référence à l'entité et interagirait avec votre stockage / base de données et le BLL gérerait toute la logique et référencerait le DAL.
la source
DAL doit être indépendant de BL et BL dépendant de DAL. Votre interface utilisateur doit uniquement accéder aux données via BL. Il est recommandé de renvoyer DataTable ou DataRow à partir de DAL, puis de convertir DataTable / DataRow en objet (s) BL. Lorsque votre interface utilisateur doit accéder aux données, elle peut y accéder à partir de BL. L'interface utilisateur sera donc indépendante du nom de la colonne et du type de base de données (SQL Server, Oracle ..). De cette façon, votre interface utilisateur sera totalement indépendante de DAL. Personnellement, je préfère le nom de classe comme "CustomerBL", n'utilisez pas le mot BL dans la mendicité du nom de classe.
Voir ci-dessous un exemple de code.
la source