Beim Implementieren des Repository-Musters für mein ASP.NET-Projekt stieß ich auf einige Probleme, auf die ich mich nicht einlassen kann. Ich habe also ein paar Fragen, wie das Repository-Muster richtig implementiert werden kann.Wie man das Repository-Muster richtig implementiert?
Aus meiner Erfahrung denke ich, dass Klassen/Modelle ohne Verhalten nur in meiner Anwendung, neben ihren Repositories ist nicht gut OOP. Aber so habe ich das Repository-Muster implementiert. Ich mache einfach überall wo ich eine Repository-Instanz brauche, um einige Aktionen durchzuführen. Das Ergebnis dieses Ansatzes war, dass alle meine Domain-Klassen kein Verhalten hatten.
Sie waren nur Objekte, die Daten ohne Methoden enthielten. Mein Lehrer sagte mir, dass ich dünne Modelle benutze und dass ich mich bemühen sollte, fette Modelle zu machen. Als Reaktion auf dieses Feedback, ich implementiert einige Business-Logik in den Klassen, aber ich lief in einige Probleme:
Szenario:
Meine User
Klasse eine Liste der Freunde mit Benutzerobjekte in sich hatte, zu repräsentieren die Freunde eines bestimmten Benutzers. Wenn Sie einem Benutzer einen neuen Freund hinzufügen, überprüft die Domänenklassenmethode, ob der "Freund" bereits in der Freundesliste vorhanden ist. Wenn nicht, wird er zur Liste hinzugefügt. Diese Änderungen müssen zur Persistenz an die Datenbank gesendet werden.
Ich weiß, dass dies im Repository für jede Domänenklasse getan werden muss, aber wo gehören die Aufrufe der Repository-Methoden in die Architektur der Anwendung?
Gerade jetzt nenne ich die Repository-Methoden in den Domänenklassenmethoden selbst in die Datenbank Änderungen bestehen bleiben:
public void AddFriend(User friend)
{
foreach(User f in Friends)
{
if(f.Username == friend.Username)
{
throw new Exception(String.Format("{0} is already a friend.", friend.Username));
}
}
Friends.Add(friend);
userRepo.AddFriend(this.Id, friend.Id);
}
Ist dies ein guter Ansatz, weil der aus irgendeinem Grunde denke ich, dass es nicht. Was den Komponententest anbelangt, so benötigen wir bei diesem Ansatz eine Abhängigkeitsinjektion, die mir sagt, dass es keine unabhängige Klasse (gut testbare Einheit) ist. Ich habe einige Posts von Leuten gelesen, die sagen, dass sie eine zusätzliche Service-Schicht oder etwas verwenden. Ich denke, diese Art von Abstraktion wird hier benötigt, aber wie sieht eine bestimmte Service-Ebene aus? Was ist drin, welche Methoden etc.?
Ich habe einige andere Schüler gesehen, die statische Methoden in einer Domänenklasse verwenden, die Funktionen wie das Hinzufügen eines neuen Objekts, das Aktualisieren eines Objekts, das Löschen eines Objekts und das Abrufen aller Objekte bietet.
Beispiel:
public class Tram
{
private static TramRepository Repo = new TramRepository(new DBTram());
public static void AddTram(int tramID, TramType type, int lineNr)
{
Tram tram = new Tram(tramID, type, TramStatus.depot, lineNr, true, null);
Repo.AddTram(tram);
}
public static List<Tram> GetAll()
{
Repo.GetAll();
}
}
ich es eine seltsame Sache, finden eine Methode, um eine neue Einheit in die Datenbank in einer Domäne Klasse hinzufügen, die das Unternehmen selbst ist. Auch für die GetAll() Methode finde ich es komisch, eine Methode in einer Klasse zu haben, die alle Straßenbahnen bekommt. So kann ein Straßenbahnobjekt alle Straßenbahnen bekommen. Ich denke, das ist eine seltsame Art, das Repository-Muster zu implementieren. Habe ich recht?
Also, welche Art von Abstraktion ist hier erforderlich? Muss es eine zusätzliche Schicht geben? Wenn ja, wie sieht diese Schicht aus? (Beispielcode) Oder suche ich in die falsche Richtung und gibt es eine andere Lösung, die das Problem des Unit-Tests mit dem Repository-Muster kontert?
Dieses Architekturproblem, auf das ich jedes Mal stoße, stellte sicher, dass ich es beantworten muss.
Ich finde es schwierig, dieses Problem klar zu erklären, aber ich hoffe, ihr versteht es.
Dies ist möglicherweise eine bessere Frage zu Software Engineering anstelle von Stack Overflow, wenn Sie sich Gedanken über Methoden und ideologische Entwurfsmuster machen. – TylerH
Es ist sehr merkwürdig, dass diese Frage aufgestanden * und * auf Eis gelegt wurde (die Tatsache, dass die Leute die Frage auffrischten, deutet darauf hin, dass die meisten die Frage gut/interessant halten), ich hätte nicht abgestimmt, um zu schließen. Allerdings lohnt es sich, dies auf Software Engineering zu übertragen. – EJoshuaS
Ich habe die Frage bearbeitet, so dass sie weniger breit und weniger meinungsbasiert ist. Anstatt zu fragen, was ihr von Designproblemen hältst, frage ich jetzt nach einer bestimmten Lösung für mein architektonisches Problem. – Maikkeyy