Pregunta

Estoy en el proceso de agregar una capa de acceso a datos para nuestra aplicación web ASP.Net 2.0 que fue escrita casi exclusivamente usando llamadas SQL en línea y un uso abundante de copiar / pegar. Debido a las preocupaciones comerciales, solo puedo refactorizar pequeñas porciones de la aplicación a la vez (no puedo instalarme y hacer un gran rediseño), por lo que tengo que vivir con ciertas decisiones de diseño hasta que las cosas estén lo suficientemente acopladas para hacer grandes cambios y probarlos correctamente.

Decidí usar el Bloque de aplicación de acceso a datos de la biblioteca empresarial como la tubería para la capa de acceso a datos en adelante, y una de esas decisiones de diseño anteriores me está causando problemas. Actualmente tenemos el " principal " cadena de conexión para nuestra aplicación desde una base de datos de administración basada en la identificación de la cuenta proporcionada por el usuario para que podamos permitir que una sola instalación de la aplicación acceda a múltiples bases de datos. Mi problema trata de tratar de descubrir las mejores prácticas para llevar esa cadena de conexión (o el ID de la cuenta) al DAL.

La implementación anterior era almacenar la cadena de conexión encriptada en una cookie, por lo que mi enfoque de pirateo actual es obtener la cadena de conexión desde allí y luego usar DAAB de la siguiente manera:

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

Donde Connection.GetConnectString () está recuperando la cadena de conexión de la cookie.

Sé que esto no está cerca de la mejor manera de hacer esto y necesito arreglarlo, pero estoy luchando con el " correcto " manera de hacerlo. Tal vez cree una clase base que pueda inicializar con la cadena de conexión y herede todas las demás clases, pero no estoy seguro de cómo se vería esto y dónde inicializaría una instancia de esa clase. ¿En cada página antes de acceder a las funciones DAL?

Cualquier orientación sería apreciada. Gracias.

Update

Déjame aclarar. Como máximo habrá 3 o 4 cadenas de conexión diferentes para una instalación. El " ID de cuenta " no es un ID de usuario y lo utilizan varios usuarios para especificar esencialmente a qué base de datos conectarse.

¿Fue útil?

Solución

Editar:

Con su última actualización, todavía recomiendo buscar en la Configuración usando el DAAB http://davidhayden.com/blog/dave/archive/ 2006/01/23 / 2744.aspx

Tengo dificultades para encontrar / abrir los documentos de Ent Lib, pero vería si tiene el equivalente del método ChangeDatabase del objeto SqlConnection. http://msdn.microsoft.com/ es-es / library / system.data.sqlclient.sqlconnection.changedatabase.aspx

Aquí hay una forma de hacerlo. Como no creo que su DAL deba saber acerca de su requisito de cambio de DB, configuraría su DAL con un ConnectionString como parámetro del constructor. Use un método / propiedad de contenedor para ocultar / encapsular ese requisito y obtener la instancia del DAL que le gustaría usar en su aplicación.

(disculpe el 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
    }
}

Espero que ayude, ¡buena suerte! Y tenga mucho cuidado con lo que pone en las cookies. ;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top