2009-04-12 6 views
12

Ich bin neu im Repository Pattern und nachdem ich viel im Internet gelesen habe, habe ich ein grobes Verständnis von dem, was vor sich geht, aber es scheint einen Konflikt von Ideen zu geben.Repository-Muster - POCOs oder IQueryable?

Eines ist, was das IRepository zurückgeben sollte.

Ich möchte in ONLY Pocos umgehen und so würde ich für jedes Aggregat Wurzel eine IRepository Implementierung haben, etwa so:

public class OrangeRepository: IOrangeRepository 
{ 
    public Orange GetOrange(IOrangeCriteria criteria); 
} 

wo IOrangeCriteria zu finden, eine orangefarbene eine Reihe von Argumenten spezifischen nimmt.

Die andere Sache, die ich habe, ist eine Reihe von Daten Back-Ends - deshalb habe ich in diesem Muster in erster Linie. Ich stelle mir vor ich werde eine Implementierung für jeweils, zB

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock etc

Ich möchte es offen halten, so dass ich EF oder NHibernate verwenden könnte - wieder, wenn meine IOrangeRepository Angebote in POCOs dann I würde dies im Repository selbst kapseln, indem ein OrangeRepositoryNHibernate usw. implementiert wird.

Bin ich auf den richtigen Linien?

Dank

EDIT: Danke für das Feedback, ich habe jemand nicht anders diese Ideen aus zur Zeit auf die Beine, so dass es zu schätzen wissen!

Antwort

9

Ja, Ihre Version ist die sicherste/kompatibelste Version. Sie können es immer noch mit ungefähr allen Ressourcen verwenden, nicht nur mit Datenzugriff, sondern auch mit Webdiensten, Dateien, was auch immer.

Beachten Sie, dass Sie mit der IQueryable-Version immer noch auf Basis Ihrer POCOs-Klassen arbeiten können, aber Sie sind an das IQueryable gebunden. Bedenken Sie auch, dass Sie Code haben könnten, der das IQueryable verwendet, und dann stellt sich heraus, dass Sie einen Fall treffen, in dem eines der ORM des Repositorys nicht gut damit umgehen kann.

5

Ich benutze das gleiche Muster wie Sie. Ich mag es sehr. Sie können Ihre Daten von beliebigen Ressourcen abrufen.

Aber der Vorteil von IQuerable ist, dass Sie Ihre eigene Kriterien-API wie die OrangeCriteria nicht codieren müssen.

Wenn NHibernate volle Linq Unterstützung bekommt, dann kann ich zum IQueryable wechseln.

Dann erhalten Sie

public class OrangeRepository: IOrangeRepository { 
    public IQueryable<Orange> GetOranges(); 
}