Ich habe einige Nachforschungen angestellt, bevor ich diese Frage gestellt habe. Eine der folgenden Fragen oder Beiträge ist unten aufgeführt. Ich konnte mir nicht klar machen, wie ich bestimmen soll.
Geschäftsobjekte innerhalb einer Datenzugriffsschicht
Ich habe ein Repository und die Business Layer rufen das Repository auf, um die Daten abzurufen. Angenommen, ich habe die folgenden Klassen für BLL und 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; }
}
Wenn die BLL ein Kundenobjekt abrufen möchte, ruft sie GetCustomerById (customerId) in DAL auf.
Folgendes sind meine Bedenken, die ich nicht klarstellen konnte:
Ich kann nicht sehen, wie bestimmt werden soll, welches Objekt die GetCustomerById in DAL zurückgeben soll. Sollte es BllCustomer oder DalCustomer zurückgeben?
Wo soll die mit dem Kunden verknüpfte Adresse abgerufen (und / oder in ein Geschäftsobjekt konvertiert) werden?
Wenn der DAL Dal-Objekte zurückgibt, kann sich die Logik zum Abrufen und Ausfüllen der Adresse nur in der BLL befinden. Wenn die DAL BLL-Objekte zurückgibt, kann die Logik zum Abrufen und Ausfüllen der Adresse entweder in der BLL oder in der DAL liegen. Derzeit gibt die DAL die Geschäftsobjekte zurück und die Logik zum Ausfüllen befindet sich in der DAL.
Nach dem, was ich gelesen habe, gibt es wohl kein Richtig oder Falsch. Über den oben angegebenen Link sagen Leute den einen und die anderen den anderen Weg. Aber wie bestimme ich, welches für meinen Fall am besten geeignet ist?
Jede Hilfe wäre dankbar.
quelle
Antworten:
Es sollte ein DalCustomer- Objekt zurückgeben. Wenn Sie ein BllCustomer- Objekt zurückgeben, wird das Prinzip der Einzelverantwortung verletzt . Sie können das DalCustomer- Objekt als Schnittstelle oder Vertrag anzeigen, die von der Geschäftsschicht (oder dem Verbraucher) verwendet werden. Wenn ein BllCustomer zurückgegeben würde, müsste der DAL für jedes Business-Layer-Objekt sorgen, das ihn aufruft oder möglicherweise aufrufen könnte.
Die Konvertierung sollte in einem Ansichtsmodell oder Manager erfolgen. Sie benötigen einen Vermittler, um Ihre Dienst- oder Datenzugriffskomponente aufzurufen. Wenn Sie dies benötigen, können Sie eine Konvertierung in Ihrem BllCustomer- Objekt vornehmen . Wenn Sie dann beispielsweise Ihre DAL von MSSQL auf Oracle umstellen, muss Ihr zurückgegebenes Objekt (oder Ihre zurückgegebene Schnittstelle) gleich bleiben.
Vorzugsweise sollte Ihre Geschäftsschicht auch unabhängig von Ihrer Datenschicht sein. Die Geschäftsschicht ist für Ihre Geschäftsregeln verantwortlich. Hier fügen Sie Ihre Validierungen mithilfe eines Validierungsframeworks hinzu, um Ihre Geschäftsregeln durchzusetzen.
quelle
Ihr Repository sollte die BLL oder das Domänenobjekt zurückgeben. Möglicherweise benötigen Sie überhaupt kein DAL-Objekt.
quelle
Customer
verfügbar machen?In der Regel kennt der DAL die BLL nicht. Stellen Sie sich das so vor, eine andere Anwendung mit einer anderen BLL könnte dieselbe DAL verwenden. Eine Anwendung / ein Modul für Verbindlichkeiten und eine App für Forderungen für dasselbe Unternehmen würden Daten (Kunden, Gebühren, Zahlungen usw.) gemeinsam nutzen. Der Versuch, eine DLL über Kenntnisse über mehr als eine BLL zu verfügen, wäre sehr schwierig und unnötig. Auf diese Weise können Sie auch Ihren Datenspeicher ändern, ohne dass dies Auswirkungen auf die BLL hat (solange Sie die Schnittstellen nicht beschädigen).
Sie können jetzt ein DAL-Objekt an die BLL übergeben oder einen dritten Satz von Objekten erstellen: Entität. Diese würden nur die Werte enthalten, die zusammen weitergegeben werden sollen. Die DAL würde auf die Entität verweisen und mit Ihrem Speicher / Ihrer Datenbank interagieren, und die BLL würde die gesamte Logik verarbeiten und auf die DAL verweisen.
quelle
DAL sollte unabhängig von BL und BL sein und von DAL abhängen. Ihre Benutzeroberfläche sollte nur über BL auf Daten zugreifen. Es empfiehlt sich, wenn Sie DataTable oder DataRow von DAL zurückgeben und dann DataTable / DataRow in BL-Objekte konvertieren. Wenn Ihre Benutzeroberfläche auf die Daten zugreifen muss, kann sie von BL aus zugreifen. Die Benutzeroberfläche ist also unabhängig vom Spaltennamen und vom Datenbanktyp (SQL Server, Oracle ..). Auf diese Weise ist Ihre Benutzeroberfläche völlig unabhängig von DAL. Persönlich bevorzuge ich Klassennamen wie "CustomerBL". Verwenden Sie das BL-Wort nicht zum Bitten um Klassennamen.
Unten siehe Beispielcode.
quelle