我正在为我们的ASP.Net 2.0 Web应用程序添加数据访问层,该应用程序几乎完全使用内联SQL调用和大量使用复制/粘贴编写。由于业务问题,我只能一次重新考虑应用程序的一小部分(无法解决并进行大规模的重新设计),所以我必须接受某些设计决策,直到事情松散耦合为止做出重大改变并正确测试它们。
我决定使用企业库数据访问应用程序块作为未来数据访问层的管道,之前的一个设计决策导致了我的问题。目前,我们根据用户提供的帐户ID从管理数据库获取应用程序的“主”连接字符串,以便我们可以允许单个安装应用程序来访问多个数据库。我的问题涉及尝试找出将连接字符串(或帐户ID)提供给DAL的最佳实践方法。
之前的实现是将加密的连接字符串存储在cookie中,因此我当前的hack方法是从那里获取连接字符串,然后以下列方式使用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,并且多个用户使用它来实质上指定要连接的数据库。
答案 0 :(得分: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
这是一种方法。由于我不认为您的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中的内容。 ;)