Generisches Repository, Data Access Layer

Ich bin erstellen Sie ein neues Projekt mithilfe von business objects (Mitarbeiter, Produkt). Aufgrund von Einschränkungen, ich bin nicht mit LINQ to SQL oder jede ORM-Mapper.

Habe ich hand-code der Data Access Layer(s). Ich bin daran interessiert, mit dem Repository-Pattern".

Nach dem, was ich verstehe, ich habe ein generic repository IRepository implementiert durch alle repositories ProductRepository, EmployeeRepository.

Was mich verwirrt ist, dass verschiedene business-Objekte haben unterschiedliche Anforderungen. Zum Beispiel:

ProductRepository

 GetAllProducts ();
 GetProductById (int id);
 GetProductByMaxPrice (double price);
 GetProductByNamePrice (string name, double Price);
 Get... (...);

EmployeeRepository

 GetEmployeeByAge ();
 GetEmployeeByJob (string description);
 GetEmployeeBySalary (double salary);
 Get... (...); //and so on

Wie kann ich erstellen ein generisches repository, das erfüllt verschiedene Anforderungen des Datenzugriffs von verschiedenen Objekten?

Habe ich gelesen, sehr viel Theorie in Bezug auf Repository-Muster, aber würde wirklich zu schätzen, ein funktionierendes Beispiel.

Außerdem, wenn ich alle Repositorys verwenden ein generisches repository, mit dem Fabrik-Muster wird einfach gut. Zum Beispiel:

interface IRepository
{
    ....
}

ProductRepository : IRepository
{
    ....
}

EmployeeRepository : IRepository
{
    ....
}

Dann können wir die factory-Muster effektiv wie:

IRepository repository;
repository = new ProductRepository ();
repository.Call_Product_Methods ();

repository = new EmployeeRepository ();
repository.Call_Employee_Methods ();
  • Die generische repository-Schnittstelle hat in der Regel nur die standards -- einfügen, erhalten durch ID, erhalten Sie alle, löschen, aktualisieren. Wie sonst könnte es sein, generische?
  • Es könnte IQueryable<T> Query { get; }
  • Wenn Sie Ihre Methoden sind anders, Sie können nicht die gleichen IRepository. Was Sie wollen, ist eine IEmployeeRepository ... und code, die. Implementieren Sie dann eine oder mehrere konkrete EmployeeRepository ist.
  • Dies kann eine Hilfe sein auf Ihrem venture : codeproject.com/Articles/488308/...
  • granadaCoder, wenn wir implementieren ein separates repository für jedes Objekt, das wir am Ende erstellen die traidional FAT DALs mit vielen Methoden die es gibt. Gibt es nicht eine elegante Art und Weise zu schreiben, eine DAL?
  • Wiktor, wie können wir IQueryable<T> Query { get; } effektiv?
  • im Allgemeinen sollte man sich nicht definieren Insert und Update generischen Operationen, da diese nicht wirklich vertreten business cases.
  • elegant = mit NHibernate ist ISession direkt wo es nötig ist. Keine Notwendigkeit zur Abstraktion.
  • In meinem Fall, wenn das Repository-Muster nicht gut genug ist, gibt es eine andere alternative, um Daten leicht für verschiedene repositories. Es scheint, dass die einzige Lösung ist, um jedes repository implementiert seine eigene Schnittstelle (EmployeeRepository:IEmployeeRepository, ProductRepository:IProductRepository). Wie ich bereits erwähnt habe, kann ich nicht mit LINQ to SQL oder anderen ORM-Mapper. Jede Hilfe ist willkommen.
  • Wer erlegt diese Einschränkungen? Verbot von ein ORM ist lächerlich, ehrlich gesagt. Hand-coded data access ist ein Service-desaster. Wenn Sie möchten, um es gut zu machen, also ohne Wände des raw-SQL und langen Strecken von mapping-code, werden Sie bald selbst schreiben Sie Ihre eigenen ORM! Dies wird sich dramatisch erhöhen die Projekt-Durchlaufzeit. Ich glaube, Sie sollten wirklich versuchen, drehen Sie ein paar Waffen irgendwo.
  • In einigen Fällen schreiben die data-access-layer ist die beste Lösung. ORM ist nicht die beste Antwort für alles. Aber vereinbart, dass einige willkürliche Verbot, es ist albern.
  • Ich dachte das gleiche, aber der Dapper-micro-ORM (nicht wirklich ein ORM, jedoch ebenso sehr ordentlich helper-Methoden) war wie ein Hauch frischer Luft, um mich gegenüber dem Melasse-wie Entity Framework. Die Vorhersagbarkeit (nie komisch "das kann nicht übersetzt werden, um SQL" oder "N", query-problem), die Freiheit, die die Leistung! Es gibt Nachteile natürlich auch, aber insgesamt würde ich zögern, gehen Sie zurück zu EF in zukünftige Projekte.

InformationsquelleAutor Code Guru | 2013-05-15
Schreibe einen Kommentar