2

Ich habe Binärdaten in meiner Datenbank, die ich irgendwann in Bitmap konvertieren muss. Ich habe darüber nachgedacht, ob es sinnvoll ist, ein Repository zu verwenden und es dort zu tun. Mein Consumer, der eine Präsentationsebene ist, wird dieses Repository verwenden. Zum Beispiel:Verwendung des Repository zwischen EF-Modell und Code-Consumer

// This is a class I created for modeling the item as is. 
public class RealItem 
{ 
    public string Name { get; set; } 
    public Bitmap Image { get; set; } 
} 

public abstract class BaseRepository 
{ 
    //using Unity (http://unity.codeplex.com) to inject the dependancy of entity context. 
    [Dependency] 
    public Context { get; set; } 
} 

public calss ItemRepository : BaseRepository 
{ 
    public List<Items> Select() 
    { 
     IEnumerable<Items> items = from item in Context.Items select item; 
     List<RealItem> lst = new List<RealItem>(); 
     foreach(itm in items) 
     { 
      MemoryStream stream = new MemoryStream(itm.Image); 
      Bitmap image = (Bitmap)Image.FromStream(stream); 
      RealItem ritem = new RealItem{ Name=item.Name, Image=image }; 
      lst.Add(ritem); 
     } 

     return lst; 
    } 
} 

Ist dies eine korrekte Methode, das Repository-Muster zu verwenden? Ich bin dieses Muster lernen, und ich habe viele Beispiele online gesehen, dass ein Repository verwenden, aber wenn ich an ihrem Quellcode sehe ... zum Beispiel:

public IQueryable<object> Select 
{ 
    return from q in base.Context.MyItems select q; 
} 

wie man kann fast kein Verhalten zu sehen ist hinzugefügt, um das System durch ihren Ansatz mit Ausnahme der versteckten Datenzugriffsabfrage, so war ich verwirrt, dass Repository möglicherweise etwas anderes ist und ich habe alles falsch. Am Ende sollte es zusätzliche Vorteile geben, sie richtig zu benutzen?

Update: Wie sich herausstellte, benötigen Sie keine Repositories, wenn Sie vor dem Versand nichts mehr an Daten machen müssen, aber warten Sie! keine Abstraktion bei LINQ-Abfrage? auf diese Weise muss der Client die Abfrageanweisungen für uns bereitstellen, die ein wenig unsicher und schwer zu validieren sind. Vielleicht stellt das Repository also auch eine Abstraktion bei Datenabfragen bereit? Wenn das der Fall ist, dann ist das Vorhandensein eines Repositories immer ein essentieller Bedarf in der Projektarchitektur !! jedoch Diese Abstraktion kann mit gespeicherten SQL-Prozeduren bereitgestellt werden. Was ist die Wahl, wenn beide Optionen verfügbar sind?

Antwort

4

Ja, das ist der richtige Weg: Der Repository-Vertrag dient den Anwendungsanforderungen und behandelt nur Anwendungsobjekte. Das (schlechte) Beispiel, das Sie die meiste Zeit sehen, koppelt jede Repository-Implementierung an IQueryable, die möglicherweise nicht von dem zugrunde liegenden ORM implementiert wird, und schließlich ist es ein Implementierungsdetail.

Der Unterschied zwischen IQueryable und IEnumerable ist wichtig, wenn es um entfernte Daten geht, aber das ist es, was das Repository an erster Stelle tut: es versteckt die Tatsache, dass Sie es mit einem Speicher zu tun haben, der remote sein kann. Für die App ist das Repository nur eine lokale Sammlung von Objekten.

aktualisiert Das Repository abstrahiert den Persistenz-Zugang, es die Anwendung von einer bestimmten Persistenz Implementierung und Masken selbst als eine einfache Sammlung entkoppelt macht. Dies bedeutet, dass die App nicht über Linq2Sql, Sql oder den Typ des verwendeten RDBMS weiß, falls vorhanden. Die App sendet/empfängt Objekte aus dem Repo, während der Repo tatsächlich persistent bleibt oder Objekte lädt. Der App ist es egal, wie der Repo es macht.

Ich halte das Repository für ein sehr nützliches Muster und verwende es in jedem Projekt, gerade weil es die Grenze zwischen der Anwendung (als Ort der Problem- und Lösungsdefinition) und der Speicherung/Persistenz der Daten markiert ist gespeichert.

+0

überprüfen Sie bitte mein Update. Vielen Dank. – jim

+0

sehe meine aktualisierte Antwort – MikeSW

1

Sie können Ihr Repository zu einem generischen machen und daraus einen Moduswert generieren. Stellen Sie sicher, dass Sie eine Schnittstelle (IItemRepository) verwenden, um auf Repositories in der Manager-Ebene zuzugreifen, sodass Sie Ihre Repositorys durch eine neue Repository-Implementierung durch eine andere Datenzugriffsmethode ersetzen können. Here is an good exampl e wie man das macht.

+0

würden Sie sich die Updates ansehen und mir Ihre Meinung mitteilen. – jim

Verwandte Themen