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

StackOverflow https://stackoverflow.com/questions/832325

Вопрос

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

Это было полезно?

Решение

Редактировать:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top