2009-05-06 3 views
0

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

Я решил использовать блок приложений доступа к данным в корпоративной библиотеке в качестве сантехники для уровня доступа к данным в будущем, и одно из таких решений предшествующего проекта вызывает у меня проблемы. В настоящее время мы получаем «основную» строку соединения для нашего приложения из базы данных администратора на основе идентификатора учетной записи, предоставленного пользователем, чтобы мы могли разрешить одной установке приложения обращаться к нескольким базам данных. Моя проблема связана с попыткой выяснить способ передовой практики получения этой строки соединения (или идентификатора учетной записи) в DAL.

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

Любое руководство будет оценено по достоинству. Спасибо.

Update

Позвольте мне уточнить. В большинстве случаев для установки будет 3 или 4 разных строки подключения. «Идентификатор учетной записи» не является идентификатором пользователя и используется несколькими пользователями для определения конкретной базы данных для подключения.

ответ

2

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 в качестве параметра конструктора. Используйте метод/свойство wrapper, чтобы скрыть/инкапсулировать это требование и получить экземпляр 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 
    } 
} 

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

+0

Спасибо. Это не совсем так, как я решил решить проблему, но она по-прежнему иллюстрирует базовую концепцию, которую я использовал. Нет больше строк подключения, хранящихся в файлах cookie! – smathson