[英]Handling a dynamic Connection String with DAAB
我正在為我們的ASP.Net 2.0 Web應用程序添加數據訪問層,該數據訪問層幾乎是完全使用嵌入式SQL調用和大量復制/粘貼功能編寫的。 由於業務方面的考慮,我一次只能重構應用程序的一小部分(無法安頓下來並進行大量的重新設計),因此我必須遵循某些設計決策,直到事情松散耦合為止進行重大更改並正確測試它們。
我決定將企業庫數據訪問應用程序塊用作以后的數據訪問層的管道,而這樣的先前設計決定給我帶來了問題。 當前,我們根據用戶提供的帳戶ID從管理數據庫中獲取應用程序的“主”連接字符串,以便我們可以允許單個安裝應用程序訪問多個數據庫。 我的問題涉及嘗試找出將連接字符串(或帳戶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功能之前在每個頁面上?
任何指導將不勝感激。 謝謝。
更新
讓我澄清一下。 一個安裝最多會有3或4個不同的連接字符串。 “帳戶ID”不是用戶ID,多個用戶使用它來指定要連接的數據庫。
編輯:
對於您的最新更新,我仍然建議使用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
這是一種實現方法。.由於我不認為您的DAL應該了解您的交換數據庫要求,因此我將使用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
}
}
希望有幫助,祝你好運! 並且要非常小心您放入Cookie中的內容。 ;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.