2016-07-06 5 views
0

Ich versuche, eine Anwendung zu erstellen, die mehrere Datenbanktypen verarbeiten kann. Bisher habe ich mein Interface so angelegt. Es ist sehr einfach und das ganze Datenbank tun, ist das Laden und Speichern ein ProfilUnterstützung von mehreren Datenbanken - gemeinsame Objekt aus Abfrage zurück

public interface IDataManager 
{ 
    Profile LoadProfile(int profileId); 

    bool SaveProfile(Profile profile); 

    bool CreateDatabase(); 

    bool OpenConnection(); 

    bool CloseConnection(); 
} 

und können nur sagen, die Profile Klasse für die oben sieht wie folgt aus.

public class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Meine Frage ist, was der beste Weg, es zu machen ist, so dass alle Implementierungen von IDataManager Rückkehr der gleichen Objekttypen?

Hier ist ein Beispiel dafür, was ich damit meine. (Dies ist kein Qualitätscode, es ist nur ein Beispiel)

Ich erstelle eine SQLite Klasse, die IDataManager implementiert und dann eine Instanz erstellen.

public IDataManager DataManager = new SQLiteDataManager(); 

später im Code möchte ich laden, um ein Profile so nenne ich die LoadProfile.

Profile profile = DataManager.LoadProfile(1); 

Meine SQLite Implementierung des LoadProfile Methode sieht wie folgt aus

public Profile LoadProfile(int profileId) 
{ 
     // Copied and pasted from a WinRT app 
     using (var conn = new global::SQLite.Net.SQLiteConnection(new global::SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), _sqlpath)) 
     { 
      var tmp = conn.Table<PROFILE>().First(x => x.ID == profileId); 
     } 

    // do something and return 
} 

Nun, wie Sie den Rückgabetyp aus der Abfrage sehen können (tmp = type PROFILE) nicht vom gleichen Typ wie der LoadProfile Methode Rückgabetyp (Profile). Muss ich tmp in Profile konvertieren? Das bedeutet, dass es in allen Methoden mit Rückgabetypen und für jede andere Datenbankimplementierung durchgeführt werden muss. oder gibt es einen besseren Weg?

Hope das macht Sinn.

+0

Du erstellst (oder zurück zu treten) auf, was ist bereits vorhanden. MySql, OleDB usw. implementieren alle die Methoden und solche, die in 'System.Data.Common' definiert sind, in einer für ihre Bedürfnisse spezifischen Weise. Das Hinzufügen von mehr Abstraktion wird all die besonderen Leckereien verstecken, die manche haben. – Plutonix

+0

Warum nicht eine allgemeine Klassenbibliothek verwenden, auf die alle Datenebenen dann verweisen können? Auf diese Weise haben Sie nicht mehrere Implementierungen von 'Profile' im Umlauf. – mason

Antwort

2

Wenn Sie Entity Framework verwenden, können Sie einfach den Provider für den DB-Typ verwenden Sie verwenden werden, aber halten alle api und Modelle der gleichen

A list of Entity Framework providers for various databases

+0

Und wenn Sie nicht Entity Framework verwenden? – Gaz83

+0

Dann verwenden Sie Dapper oder ein anderes ORM, das ist die Aufgabe eines ORM, um all diese Mapping-Arbeiten von 'PROFILE' nach' Profil' für Sie durchzuführen, damit Sie es nicht selbst schreiben müssen. –

Verwandte Themen