Обработка динамической строки подключения с помощью DAAB

Я добавляю уровень доступа к данным для нашего веб-приложения ASP.Net 2.0, которое было написано почти исключительно с использованием встроенных вызовов SQL и обильного использования копирования / вставки. Из-за бизнес-соображений я могу повторно учитывать только небольшие части приложения за раз (не могу освоиться и провести масштабный редизайн), поэтому мне приходится жить с определенными дизайнерскими решениями, пока все не станет достаточно слабым. внести большие изменения и правильно их протестировать.

Я решил использовать блок приложения доступа к данным корпоративной библиотеки в качестве основы для уровня доступа к данным в будущем, и одно такое предыдущее проектное решение вызывает у меня проблемы. В настоящее время мы получаем «основную» строку подключения для нашего приложения из базы данных администратора на основе идентификатора учетной записи, предоставленного пользователем, так что мы можем разрешить одной установке приложения доступ к нескольким базам данных. Моя проблема связана с попыткой выяснить, как лучше всего получить эту строку подключения (или идентификатор учетной записи) в 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 различных цепочек подключения. «Идентификатор учетной записи» не является идентификатором пользователя и используется несколькими пользователями, чтобы указать, к какой базе данных следует подключиться.


person smathson    schedule 06.05.2009    source источник


Ответы (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, который вы хотели бы использовать в своем приложении.

(прошу прощения за С #)

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. ;)

person Chad Grant    schedule 06.05.2009
comment
Спасибо. Не совсем так я решил проблему, но все же иллюстрирует основную концепцию, которую я использовал. Больше никаких строк подключения, хранящихся в файлах cookie! - person smathson; 13.05.2009