Ich habe keine Probleme mit Code seit meinem letzten Problem mit der Kovarianz der Schnittstelle. Heute habe ich eine andere Annäherung an die OLGAtherer Architektur genommen und ich fand großes (für mich) Hindernis. Ich hoffe, dass seine großen nur für mich und ich werde finden hier beantworten :) OK, bitte check this out:Wie auf generische abstrakte Klasse zeigen?
Ich habe abstrakte allgemeine Klasse:
abstract class Repository<T> where T : Entity
diese Klasse enthält Unterschriften von vier CRUD Methoden (add , einfügen usw.) und zwei geschützte Felder. Jedes Repository, das ich erstellen möchte, muss von dieser Oberklasse erben. Ich habe Repositories wie zum Beispiel:
class BookRepository : Repository<Book>
Jetzt Klasse DB Ich habe, die für den Betrieb auf DB-Datei verantwortlich ist. Und da ist mein Problem. bei dieser Methode in DB-Klasse platziert aussehen:
void Add(List<Entity> enitites, Type entityType)
{
Repository<entityType> repo = EntitiesFactory(entityType);
repo.Add(entities);
}
Ich weiß, dass oben genannte Verfahren wird nicht funktionieren, aber das ist mein Problem visualisieren (hoffentlich) - Ich möchte dynamisch Repository des angegebenen Typs schaffen, aber ich habe keine Ahnung wie man das macht. Dies war immer mein Haupt-OOP-Problem - ich konnte die Vererbung (oder die Implementierung von Schnittstellen) codieren, aber ich konnte diese geerbten Klassen nicht verwenden. Bitte klären Sie dies mit mir. Vielen Dank im Voraus.
Paweł
benutzte ich Hinweise, die Ihnen zur Verfügung gestellt, und das ist, was ich habe jetzt:
public void Add<T>(List<T> entities, string repoName) where T : Entity
{
Repository<T> repo = RepoFactory<T>(repoName, typeof(T));
repo.Add(entities);
}
private Repository<T> RepoFactory<T>(string repoName, Type t) where T : Entity
{
if (t == typeof(Book))
{
Repository<T> repo = (Repository<T>)((object)(new BookRepository(this.ConnectionString, repoName)));
}
return null;
}
RepoFactory ist jetzt in DB-Klasse (das heißt, durch die Weg, eine Art Brücke hier) - es sollte wahrscheinlich woanders hin verschoben werden, aber es ist kein Hauptproblem hier.
Erstens, ich weiß nicht, ob RepoFactory Körper in der richtigen Weise implementiert ist - ich denke nicht.
Zweitens - ich nehme an, dass ich DB-Methoden von einer anderen Klasse (sagen wir mal - WindowsForm, der Einfachheit halber) aufrufen wird. Ich werde Add mit dem Parameter T abhängig von der Wahl des Benutzers aufrufen. Dies ist Situation, dass ich Problem habe und behebe es vorübergehend, weil jetzt DB OK ist, aber wenn ich WindowsForm Code implementieren müsste, werde ich es ein anderes Mal treffen (denke ich) - in der Zukunft werde ich versuchen, Antwort auf herauszufinden die gleiche Frage, aber auf der höheren Ebene (über DB) - Ich hoffe, Sie verstehen mich ... Ich meine im Grunde, dass ich nicht wissen, wie Add-Methode dynamisch aufrufen, weil T abhängig von der Wahl des Benutzers sein wird (OLGAtherer hat Repository-Manager zu sein, der Bücher und andere Sammlungen unterstützt). Und wenn der Benutzer versucht, mit seiner Büchersammlung zu arbeiten, muss ich die Methode Add() aufrufen. Wenn mit der Comics-Sammlung, Hinzufügen(). Ich möchte die Klasse nicht für jede Art von Sammlung oben schreiben, sondern einen Aufruf von Add verwenden, um dies zu tun.
Wenn du verstehst, was ich meine, du bist wirklich gut :) Mein Englisch saugt, aber ich arbeite daran. Vielen Dank für die vorherigen Antworten und danke im Voraus für weitere. Paweł
Hmmm, ich denke du versuchst das Rad neu zu erfinden. Warum würden Sie Ihr eigenes ORM schreiben, wenn es bereits viele gut entwickelte Alternativen wie NHibernate und Linq2Sql gibt? – Juliet
'DB' klingt wie ein Gott-Objekt und' EntitiesFactory' klingt wie ein Service-Locator. Sie stellen sich auf ein nicht zu bewältigendes, nicht testbares Desaster ein. – jason
Hallo, ich weiß, dass dies vielleicht keine gute Idee ist - ich lerne immer noch und ich weiß, dass das Mastering von OOP Jahre dauern wird. Aber wenn Sie sich meinen Quellcode von Sourceforge ansehen würden, würde ich annehmen, dass Sie die Architektur akzeptieren würden, die ich bisher erstellt habe. Danke für die Antwort trotzdem. – skrzeczowas