2009-05-06 23 views
0

私はASP.Net 2.0 Webアプリケーション用のデータアクセスレイヤーを追加しています。これは、ほとんどの場合、インラインSQL呼び出しとコピー/ペーストを多用しています。ビジネス上の懸念から、私は一度にアプリケーションの小さな部分を再構築することができます(巨大な再設計をすることはできません)。だから、十分に緩やかに結合されるまで設計上の決定を下す必要があります大きな変更を加えて適切にテストします。DAABを使用した動的接続文字列の処理

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

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 

接続:私の現在のハック・アプローチは、そこから接続文字列を取得してから、次のようにDAABを使用することですので

以前の実装では、クッキー内の暗号化された接続文字列を格納しました。 GetConnectString()は、Cookieから接続文字列を取得しています。

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

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

更新

私は明確にしましょう。多くの場合、インストールには3つまたは4つの異なる接続文字列があります。 「アカウントID」はユーザーIDではなく、基本的に複数のユーザーが接続するデータベースを指定するために使用されます。

答えて

2

編集:あなたの最新のアップデートで

、私はまだ私が困難見つける/耳鼻咽喉科Libのドキュメントを開くを抱えているが、それならば、私は見ることがDAAB http://davidhayden.com/blog/dave/archive/2006/01/23/2744.aspx

を使用してコンフィギュレーションに探してお勧めしますSqlConnectionオブジェクトのChangeDatabaseメソッドに相当します。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx

あなたのDALがあなたのスイッチングDB要件を知っているべきではないと思いますので、DALをコンストラクタのパラメータとしてConnectionStringで設定します。ラッパーメソッド/プロパティを使用してその要件を非表示/カプセル化し、アプリで使用する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 
    } 
} 

役に立てば幸い、幸運を! 非常に慎重にクッキーに入れて何かを入れてください。 ;)

+0

ありがとうございます。これは私が問題を解決する方法を正確にはしませんでしたが、私が使用した基本的な概念はまだ説明しています。クッキーに保存されている接続文字列はもうありません! – smathson

関連する問題