2

古き良きado.netの方法でデータアクセス層を構築しようとしています。従来、私は単純なリポジトリパターンに従ってdalを構築していました。しかし、最近記事でこのパターンについて読んだので、今回はAbstractFactoryパターンを試してみたいと思います。

そこで、ここでは、抽象ファクトリパターンを使用して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)これは抽象ファクトリパターンの正しい実装ですか?2)何がより良くできるか?3)基本クラスから継承するさまざまなリポジトリクラスに対する利点は何ですか?

たくさんの人に感謝します。

私のコードについてさらに情報が必要な場合は教えてください。しかし、現時点ではもうありません!

4

2 に答える 2

3

抽象dbプロバイダーファクトリはすでに.Netに存在します。その呼ばれるDbProviderFactory。を介してさまざまなコンクリート工場を作成できます

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

すでに箱に入っているものを使わないのはなぜですか?

ここでは、DbProviderFactoriesの詳細と、カスタムファクトリ実装を追加する方法を読むことができます。

于 2012-04-27T10:47:37.670 に答える
0

あなたはいくつかの概念を混ぜ合わせたと思います。

リポジトリを使用すると、ストレージの性質から抽象化できます。これはブラックボックスであり、いくつかの基準に一致するオブジェクトを提供し、それを取り戻すことができます。リポジトリ内部は、オブジェクトを複数のデータソースで取得または保存できます(たとえば、データベースに保存されているオブジェクトデータ、データの別の部分-ファイル内、またはリレーショナルデータソースの観点から説明できない外部デバイス内)。

Factoryは、ADO.NETデータソースを操作するときに柔軟性を追加できます。しかし、それはリポジトリの代わりではありません。リポジトリはファクトリを使用して、特定のデータソースの実装を取得できます。

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

于 2012-04-27T10:44:07.743 に答える