2009-04-21 5 views
1

Ich habe die folgenden Datenbanktabellen zu arbeiten und ich bin irgendwie neu zu oop, also dachte ich, ich würde hier fragen.Class Design Hilfe

assignment 
---------- 
id 
person_id 
assigned_address_id 
position_id 

person 
---------- 
person_id 
current_address_id 
name 
ssn 
drivers_license 

address 
--------- 
id 
address_number 
address_street 
address_city 
address_state 
address_zip 

position 
--------- 
id 
description 
rate 

Ich habe die folgenden Klassen erstellt

Person Class 
int? id 
Address currentAddress 
string Name 
string ssn 
string drivers_license 

PersonAssignment Class 
id 
person_id 
Address assignedAddress 
Position assignedPosition 

Address Class 
string address_number 
string address_street 
string address_city 
string address_state 
int address_zip 

Position Class 
int? id 
string description 
double payment_rate 

ich auch Seprate Dienstklassen für jedes der Objekte, die die Dal.Repository zugreifen und führen crud Methoden auf jedes der Objekte erstellt haben. dh

PersonService Class 
Update(Person p) 
Insert(Person p) 
GetListOfPeople() 
GetPerson() 

PersonAssignmentService Class 
Update(PersonAssignment p) 
Insert(PersonAssignment p) 
GetListOfPeopleAssignments() 
GetAssignment() 

Ich habe auch Repositorys für jedes der Objekte

dh

PersonRepository Class 
Update(PersonAssignment p) 
Insert(PersonAssignment p) 
GetListOfPeopleAssignments() 
GetAssignment() 

Auf meiner Webseite, die sowohl eine Personen Zuordnung enthält und die Personen persönliche Daten finde ich mich anrufen PersonService und PersonAssignmentService.

Das scheint nur eine Menge Arbeit. Mache ich etwas falsch? Vielleicht gibt es eine einfachere Möglichkeit, so etwas zu entwerfen, und ich verstehe es einfach nicht.

Vielen Dank für jede Hilfe

Dank

Antwort

0

Datenbank-Design und Klassen kann manchmal schwierig sein, auf Geschäftsregeln zur Kritik und vieles davon hängt wirklich und die Art der Transaktionen, die Sie haben.

Für Anfänger hätte ich keine separate Tabelle für die Adresse einer Person und ich würde keine bestimmte Klasse erstellen, die definiert und Adresse.

Ich bin nicht sicher, welche Programmiersprache Sie verwenden, aber es wäre wahrscheinlich Ihre Zeit wert sein ORM zu überprüfen (relationales Mapping Object)

+0

Sieht von den Tags wie er mit C# ... – Damovisa

1

Was müssen Sie Design zu tun ist, und eine Datenzugriffsschicht implementieren:

http://rlacovara.blogspot.com/2009/02/high-performance-data-access-layer.html

der Artikel ist das beste, was ich bisher gesehen habe in der beschreibt, wie Sie eine Datenzugriffsschicht schreiben würde. Der Autor beschreibt, dass Sie DTO (Data Transportation Objects) erstellen müssen, um Ihre Daten von der Datenzugriffsebene in die Business-Schicht (oder in eine andere Ebene, in die sie in native Anwendungsklassen konvertiert werden können) zu verschieben. Er stellt Basisklassen und Code zur Verfügung, die Sie bei Datentransportobjekten unterstützen, Code zum Auffüllen des DTO und Code zum Speichern des DTO in der Datenbank.

Es gibt drei Artikel in der Serie, und ich empfehle, den gesamten Satz zu lesen.

+0

Danke, ich werde einen Blick darauf werfen. – zSynopsis

0

Ich bin nicht 100% sicher, was Ihre Webseite tut, aber vorausgesetzt, Sie haben eine PersonAssignment ID und Sie erhalten ein PersonAssignment-Objekt von diesem, und dann das Person-Objekt selbst, erleichtert das folgende möglicherweise:

Fügen Sie in der PersonAssignment-Klasse eine Eigenschaft hinzu, die auf das Person-Objekt und nicht nur auf eine Person-ID verweist.Von Ihrem Beispiel:

PersonAssignment Class 
id 
person_id 
Person person 
Address assignedAddress 
Position assignedPosition 

Im GetPersonAssignment Methode (die ich nehme an einen Parameter übernimmt), einige Arbeit, um das Person-Objekt zu füllen. Sie müssen den Methoden Einfügen und Aktualisieren hinzufügen, um dies ebenfalls zu berücksichtigen.

0

Je nach Ihren Regeln sieht es so aus, dass jede Person nur eine Adresse haben kann. Wenn jemand sich bewegt, verlieren Sie seine letzte Adresse, da es keine person_id in der Adresstabelle gibt.

Aber das ist pingelig.

Die Verwendung eines DAO, wie oben erwähnt, ist eine ausgezeichnete Idee. Halte die Logik getrennt.

Ich würde mit dem Schreiben der DAO beginnen, stellen Sie sicher, dass es alles tut, was es tun soll, dann an der nächsten Schicht arbeiten, auf diese Weise können Sie Änderungen an der Datenbank vornehmen, die benötigt wird.

Wenn Sie neu in C# sind, sollten Sie sich die verschiedenen Tools von .NET 3.5 ansehen, da es viele Änderungen gab, um den Datenbankzugriff zu vereinfachen und die tatsächliche Datenbank zu abstrahieren.

Ein Vorteil besteht darin, dass einige Ihrer Datenquellen aus einer XML-Datei stammen und Ihr DAO problemlos funktioniert, unabhängig von der Quelle der Datenquelle.

0

Es klingt, als ob Sie in einem Framework arbeiten, das von jemand anderem entwickelt wurde, wo Sie Services-Klassen, Repositories und eine DAL haben und jetzt, wo Sie all diese Sachen haben, schauen Sie sich den großen Stapel Code an und fragen: "gibt es keinen einfacheren Weg". Die kurze Antwort ist ja, es gibt immer einen leichteren Weg. Es gibt so viele verschiedene Möglichkeiten, Daten zu öffnen, wie es Entwickler gibt. Das Modell, das Sie verwenden, ist ziemlich komplex und klingt, als ob es den Prinzipien des Domain Driven Design folgt. DDD ist eine großartige Methode und es bietet eine hervorragende Trennung von Bedenken und hohe Testbarkeit. Aber es erfordert auch eine Menge Klempner-Code und es ist nicht gut von den meisten. NET-Programmierer verstanden, so Hilfe zu bekommen kann schwierig sein. Ich denke, es ist der beste Weg, um Unternehmensanwendungen zu erstellen, aber es ist nicht das beste Modell für Sie, wenn Sie neu bei OOP sind.

Wenn Sie ein kleines Projekt durchführen, sollten Sie die BLL insgesamt umgehen, keine Serviceklassen, keine Repositories, nur ein gemeinsames Lib/Projekt, das Ihre Entitätsklassen enthält, und eine DLL erstellen, die Datenzugriffsmethoden enthält die Ihre Entitäten direkt füllen und speichern.

Ein noch einfacherer Ansatz besteht darin, die Entitätsklassen zu entfernen und Ihre DLL nur ADO.Net DataTables zurückgeben, die Ihre Entitätsdaten enthalten. Dieser Ansatz verliert die starke Typisierung einer Entitätsklasse, ist jedoch viel einfacher zu implementieren.

Ein anderer Ansatz ist die Verwendung von Entity Framework. EF wird das alles für Sie tun und es wird stark typisierte Entitätsklassen generieren. Es dauert eine Weile, bis Sie sich an EF gewöhnt haben, aber wenn Sie erst einmal verstanden haben, wie man damit arbeitet, kann die Zeit für das Schreiben von Persistenz-Code drastisch reduziert werden. Für einige gute Tutorials auf EF, überprüfen Sie Rob Bagby's blog