0

私は、ASP.Net 2.0 Web アプリケーション用のデータ アクセス レイヤーを追加しようとしています。このアプリケーションは、インライン SQL 呼び出しと大量のコピー/貼り付けのみを使用して記述されています。ビジネス上の懸念により、一度にアプリケーションの小さな部分しかリファクタリングできません (落ち着いて大規模な再設計を行うことはできません)。大きな変更を加えて適切にテストする。

Enterprise Library Data Access Application Block を今後のデータ アクセス層の配管として使用することにしましたが、そのような以前の設計上の決定の 1 つが問題を引き起こしています。現在、アプリケーションの「メイン」接続文字列は、ユーザーが提供したアカウント ID に基づいて管理データベースから取得されるため、アプリケーションの 1 回のインストールで複数のデータベースにアクセスできます。私の問題は、その接続文字列 (またはアカウント ID) を DAL に取得するためのベスト プラクティスの方法を見つけようとすることです。

以前の実装では、暗号化された接続文字列を Cookie に保存していたため、現在のハック アプローチは、そこから接続文字列を取得し、次の方法で DAAB を使用することです。

Public Shared Function GetResultsByKeywords(ByVal key1 As String, ByVal key2 As String, ByVal key3 As String, ByVal key4 As String) As DataTable
    Dim db As SqlDatabase = New SqlDatabase(Connection.GetConnectString())
    Dim dt As DataTable = New DataTable

    Using dr As IDataReader = db.ExecuteReader("sel_eHELP_ITEMS", key1, key2, key3, key4)
        dt.Load(dr)
    End Using

    Return dt
End Function

Connection.GetConnectString() が Cookie から接続文字列をフェッチしている場所。

これが最善の方法ではないことはわかっており、修正する必要がありますが、それを実行するための「正しい」方法に苦労しています。接続文字列で初期化して他のすべてのクラスを継承できる基本クラスを作成するかもしれませんが、これがどのように見えるか、そのクラスのインスタンスを最初にどこで初期化するかはわかりません。DAL 関数にアクセスする前にすべてのページで?

任意のガイダンスをいただければ幸いです。ありがとうございました。

アップデート

明確にさせてください。1 つのインストールに対して、最大で 3 つまたは 4 つの異なる接続文字列が存在します。「アカウント ID」はユーザー ID ではなく、基本的に接続先のデータベースを指定するために複数のユーザーによって使用されます。

4

1 に答える 1

2

編集:

最新の更新では、DAAB http://davidhayden.com/blog/dave/archive/2006/01/23/2744.aspxを使用して構成を調べることをお勧めします。

Ent Lib ドキュメントを見つけたり開いたりするのに苦労していますが、SqlConnection オブジェクトの ChangeDatabase メソッドと同等のものがあるかどうかを確認します。http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx

これを行う1つの方法は次のとおりです..DALがDBの切り替え要件を知っている必要はないと思うので、コンストラクターのパラメーターとしてConnectionStringを使用してDALをセットアップします。ラッパー メソッド/プロパティを使用してその要件を非表示/カプセル化し、アプリで使用する DAL のインスタンスを取得します。

(C#を許してください)

public class MyDAL
{
    private string _connectionString;

    public MyDAL(string connectionString)
    {
        _connectionString = connectionString;
    }

    public int MyDatabaseCall()
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            using (SqlCommand cmd = new SqlCommand("my sql", conn))
            {
                conn.Open();
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    //...data access
                    return 0;
                }
            }
        }
    }
}

public class MyApp
{
    public static Dictionary<string, MyDAL> myDatabases = new Dictionary<string, MyDAL>();

    public string GetConnectionString(string database)
    {
        return System.Configuration.ConfigurationManager.ConnectionStrings[database].ConnectionString;
    }

    public void StartUp() // Global.asax Application_Start ?
    {
        myDatabases.Add("Database1", new MyDAL(GetConnectionString("Database1")));
        myDatabases.Add("Database2", new MyDAL(GetConnectionString("Database2")));
        myDatabases.Add("Database3", new MyDAL(GetConnectionString("Database3")));
    }

    public MyDAL DataAcccessLayer
    {
        get
        {
            string usersDB = FigureOutUsersDatabase();
            return myDatabases[usersDB];
        }
    }

    public void UseSomeData()
    {
        var myData = DataAcccessLayer.MyDatabaseCall();
        //Do Stuff
    }
}

お役に立てば幸いです、頑張ってください!また、クッキーに入れるものには十分注意してください。;)

于 2009-05-06T23:53:35.460 に答える