0

ASP.Net Web アプリケーションのコード ベース全体をリファクタリング中です。アプリケーションのほぼ全体で、C# コードからデータベースへのクエリに SQL ステートメントが使用されており、同様の SQL ステートメントがコードベース全体に散らばっています。アプリケーションは、一般的に使用されているデータベースではない Mimer データベースを使用しています。

このようなアプリケーション、特にデータアクセスレイヤーで重複コードを削除してDRYを確保するための適切なリファクタリング計画は何ですか?

4

1 に答える 1

0

GetUser()アプリケーションがandUpdateWidget()の代わりにand のようなメソッドを呼び出すように、データベースの実装に抽象化のレイヤーを実装しますIDbCommand.ExecuteReader()

これらのメソッドは、エンティティ タイプごとに 1 つずつ、インターフェイスに存在します。

IUserRepository
IWidgetRepository

データベース プラットフォームごとに、各インターフェイスの実装者が 1 人必要です。

MySqlUserRepository
MySqlWidgetRepository

MimerUserRepository
MimerWidgetRepository

次に、関連するデータベース プラットフォームに対して要求されたエンティティ タイプの正しい実装クラスのインスタンスを提供するファクトリ クラスを作成します。

ファクトリ クラスは、アプリケーションが現在使用するように構成されているデータベース プラットフォームを認識してインスタンス化する必要があります。この情報を使用して、インスタンス化するクラスを選択し、要求されたときに返す必要があります。

class RepoFactory
{
    string _platform;
    public RepoFactory(string platform) { this._platform = platform; }

    public IUserRepository GetUserRepository()
    {
        if (_platform == "mysql") return new MySqlUserRepository();
        if (_platform == "mimer") return new MimerUserRepository();
        throw new NotSupportedException(_platform);
    }

    public IWidgetRepository GetWidgetRepository() // ...
}

RepoFactory の単一インスタンスへの参照を保持して、構成から 1 回だけセットアップする必要があるようにします。

すべてのデータベース プラットフォーム固有のものをインプリメンター クラスに貼り付けます。これで作業は完了です。(Mimer に必要なすべてのクエリは既に作成されています。アプリからこの新しいデータ レイヤーに移植するだけです。)

于 2012-12-20T16:21:34.473 に答える