Обработка динамической строки соединения с DAAB - PullRequest
0 голосов
/ 07 мая 2009

Я нахожусь в процессе добавления уровня доступа к данным для нашего веб-приложения 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 Ответ

2 голосов
/ 07 мая 2009

Edit:

С вашим последним обновлением я все же рекомендую просмотреть конфигурацию с помощью 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
    }
}

Надеюсь, это поможет, удачи! И будьте очень осторожны , что вы положили в печенье. ;)

...