Обработка динамической строки соединения с DAAB
Я нахожусь в процессе добавления уровня доступа к данным для нашего веб-приложения ASP.Net 2.0, которое было написано почти исключительно с использованием встроенных вызовов SQL и обильного использования копирования / вставки. Из-за проблем бизнеса я могу перефакторировать только небольшие части приложения за раз (не могу приспособиться и выполнить огромный перепроектирование), поэтому мне приходится жить с определенными проектными решениями, пока все не будет достаточно слабо связанным сделать большие изменения и проверить их правильно.
Я решил использовать прикладной блок доступа к данным Enterprise Library в качестве прокладки для уровня доступа к данным в будущем, и одно такое предыдущее проектное решение вызывает у меня проблемы. В настоящее время мы получаем "основную" строку подключения для нашего приложения из базы данных администратора на основе идентификатора учетной записи, предоставленного пользователем, чтобы мы могли разрешить одну установку приложения для доступа к нескольким базам данных. Моя проблема связана с попыткой найти наилучший способ передачи этой строки подключения (или идентификатора учетной записи) в 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 разных строки подключения для установки. "Идентификатор учетной записи" не является идентификатором пользователя и используется несколькими пользователями, чтобы по существу указать, к какой базе данных подключаться.
1 ответ
Редактировать:
С вашим последним обновлением я по-прежнему рекомендую просмотреть конфигурацию с помощью DAAB http://davidhayden.com/blog/dave/archive/2006/01/23/2744.aspx
У меня возникают трудности с поиском / открытием документов Ent Lib, но я бы посмотрел, имеет ли он эквивалент метода ChangeDatabase объекта SqlConnection. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx
Вот один из способов сделать это... Поскольку я не думаю, что ваш DAL должен знать о ваших требованиях к переключаемой БД, я бы настроил ваш 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
}
}
Надеюсь, что это помогает, удачи! И будьте очень осторожны с тем, что вы положили в печенье.;)