2012-04-27 12 views
2

私は、データアクセス層を良い古いado.netの方法で構築しようとしています。伝統的に私は簡単なリポジトリパターンに従ってdalを構築していました。しかし、今回は、このパターンを最近記事で読んだので、Abstract Factoryパターンを試してみたいと思います。抽象ファクトリパターンを実装する際の正しいアプローチは?

ここでは、抽象ファクトリパターンでdalをコーディングしようとしています。まず、私がこれまでに得たことを説明しましょう。私が後で知りたいのは、自分のアプローチがこのパターンを実装する正しい方法であるのか、そしてリポジトリアプローチにとって利点があるのか​​ということです。

だから私は、次のクラスを書いた:短期で

public abstract class Db 
{ 
    //this is class will contain methods like: 
    //public abstract IDbConnection CreateConnectionInstance(); 
} 

public class SqlDb : Db 
{ 
    //this is class will contain methods like: 
    //public override IDbConnection CreateConnectionInstance() 
    //{ 
    //  ... return new SqlConnection(); 
    //} 
} 

public class OracleDb : Db 
{ 

} 

public class MockupDb : Db 
{ 

} 

//this class generates the fitting provider but does not have a base (is this correct?) 
public static class DbFactory 
{ 
    public static Db CreateInstance(DbProviderType dbProviderType) 
    { 
     Db db = null; 
     switch (dbProviderType) 
     { 
      case DbProviderType.Oracle: 
       db = new OracleDb(); 
       break; 
      case DbProviderType.Sql: 
       db = new SqlDb(); 
       break; 
      case DbProviderType.Mockup: 
       db = new MockupDb(); 
       break; 
      default: 
       break; 
     } 
     return db; 
    } 
} 

だから私の質問に: 1)これは、Abstract Factoryパターンの正しい実装ですか? 2)もっとうまくいくことができますか? 3)ベースクラスから継承する異なるリポジトリクラスに対する利点は何ですか?

Thx多くの人。

私のコードの詳細については、私に教えてください。しかし、この時点ではもう存在しません!

答えて

3

要約dbプロバイダファクトリはすでに.Netに存在します。それはDbProviderFactoryと呼ばれています。

var factory = DbProviderFactories.GetFactory("System.Data.OracleClient"); 
DbConnection connection = factory.CreateConnection(); 

何が入っているのを使ってみませんか?

Here DbProviderFactoriesとカスタムファクトリ実装を追加する方法について詳しくは、こちらを参照してください。

0

私はいくつかのコンセプトを混ぜ合わせたと思います。

リポジトリを使用すると、ストレージの性質から抽象的なデータを抽出することができます。それはあなたにオブジェクトを与え、いくつかの条件を満たすことができるブラックボックスです。リポジトリ内部は、複数のデータソース(例えば、データベースに格納されたいくつかのオブジェクトデータ、ファイル内の別のデータ部分、または外部デバイス内の関係データソースに関して記述することができないオブジェクト)を取得または格納することができる。

工場では、ADO .NETデータソースを使用して作業するときに、より柔軟性を高めることができます。しかし、それはリポジトリの代用品ではありません。リポジトリは特定のデータソース実装を取得するためにファクトリを使用できます。

Upd。コードサンプルについて - プロバイダの型が不明な場合、ファクトリは例外をスローする必要があります。

関連する問題