2016-07-06 4 views
0

複数のデータベースタイプを処理できるアプリケーションを作成しようとしています。 これまでのように私はInterfaceを作成しました。その非常にシンプルで、すべてのデータベースが行いますが、プロファイル複数のデータベースをサポートする - 照会の共通オブジェクトを返す

public interface IDataManager 
{ 
    Profile LoadProfile(int profileId); 

    bool SaveProfile(Profile profile); 

    bool CreateDatabase(); 

    bool OpenConnection(); 

    bool CloseConnection(); 
} 

をロードし、保存され、ちょうどこのような上記のルックスのためProfileクラスを言うことができます。

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

私の質問はIDataManagerのすべての実装は、同じオブジェクトの型を返すように、それを作るための最善の方法は何かありますか?

ここに私がこれを意味する例があります。

私はSQLiteクラスを作成し、IDataManagerを実装してインスタンスを作成します。

その後私は Profileので、私は LoadProfileを呼び出すをロードするコードで
public IDataManager DataManager = new SQLiteDataManager(); 

LoadProfile方法の

Profile profile = DataManager.LoadProfile(1); 

私のSQLiteの実装では、今、あなたは、クエリ(tmp = type PROFILE)からの戻り値の型がLoadProfileメソッドの戻り値の型(と同じタイプではありません見ることができるように、この

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 
} 

のように見えますProfile)。 tmpProfileに変換する必要がありますか?つまり、戻り値の型を持つすべてのメソッドと、異なるデータベースの実装ごとに行う必要があります。またはこれを行うためのよりよい方法がありますか?

希望はこれが理にかなっています。

+0

あなたが再作成されているAPI(またはバックペダリング)を維持することができますエンティティフレームワークを使用している場合はどのようなもう存在している。 MySql、OleDBなどはすべて、必要に応じた方法で 'System.Data.Common'で定義されたメソッドなどを実装します。より多くの抽象化を追加すると、あるものが持つ特製のものをすべて隠すことになります。 – Plutonix

+0

すべてのデータレイヤーが参照できる共通のクラスライブラリを使用してみませんか?そうすれば、 'Profile'が複数浮動することはありません。 – mason

答えて

2

あなたはちょうどあなたが使用するDBタイプ用のプロバイダを使用しますが、上のすべてとモデルと同じ

A list of Entity Framework providers for various databases

+0

Entity Frameworkを使用しない場合は、 – Gaz83

+0

そして、ORMの仕事であるDapperや他のORMを使って、 'PROFILE'から' Profile'へのすべてのマッピング作業を行いますので、自分で書く必要はありません。 –

関連する問題