none
Clase static RRS feed

  • Pregunta

  • Hola como va ?. Tengo las siguientes dudas, tengo una clase

    public static class CadenaConexion
        {
            
            // Atributos
            private const string Servidor = @"DESKTOP";
            private const string BaseDatos = @"mibase";
            private const string Usuario = @"sa";
            private const string Password = @"pass";
            private const string DBFilename = @"E:\desarrollos\bases\mibase.mdf";
    
            // Propiedad
            public static string ObtenerCadenaSql => $"Data Source={Servidor}; " +
                                                     $"Initial Catalog={BaseDatos}; " +
                                                     $"User Id={Usuario}; " +
                                                     $"Password={Password}; " +
                                                     $"AttachDBFilename={DBFilename};";
    
            public static string ObtenerCadenaWin => $"Data Source={Servidor}; " +
                                                     $"Initial Catalog={BaseDatos}; " +
                                                     $"AttachDBFilename={DBFilename}; " +
                                                     $"Integrated Security=true;";
        }


    Luego en la clase datacontext

    public class DataContext : DbContext
        {
            public DataContext()
                : base(ObtenerCadenaSql)
            {
             
            }

    en la clase cadenaconexion pongo los valores y funciona correcto

    En el formulario de inicio del programa cree un metodo

    public static void LeerConf()
            {
                string appPath = Path.Combine(Application.StartupPath, @"conf\conf.txt");
                
                Servidor = File.ReadAllLines(appPath)[0];
                BaseDatos = File.ReadAllLines(appPath)[1];
                Usuario = File.ReadAllLines(appPath)[2];
                Password = File.ReadAllLines(appPath)[3];
                DBFilename = File.ReadAllLines(appPath)[4];
                
            }

    Aquí leo valores de un txt que lo que intento hacer es pasar esos valores a la clase cadenaconexion, pero no puedo crear el constructor y si le quito el static la clase datacontext no me toma ObtenerCadenaSql. desde ya gracias

    PD:(la base de datos la creo con codefirst por eso intento probar hacer esos cambios)

    martes, 12 de enero de 2021 15:20

Respuestas

  •  en caso de usar la primera opción desde el constructor estático, me surge la duda en el formulario de inicio del programa debería llamar primero al método que cargue los valores

    No, no. Esta opción es en lugar de cargar estos valores en el inicio del programa. Dado que el sistema garantiza que el constructor estático se ejecuta antes de que hagas ninguna llamada a la clase, no se necesita que escribas nada en el inicio.

    Te quedaría más o menos así:

    public static class CadenaConexion
        {
            private static readonly string Servidor;
            private static readonly string BaseDatos;
            private static readonly string Usuario;
            private static readonly string Password;
            private static readonly string DBFilename;
    
            public static string ObtenerCadenaSql => $"Data Source={Servidor}; " +
                                                     $"Initial Catalog={BaseDatos}; " +
                                                     $"User Id={Usuario}; " +
                                                     $"Password={Password}; " +
                                                     $"AttachDBFilename={DBFilename};";
    
            public static string ObtenerCadenaWin => $"Data Source={Servidor}; " +
                                                     $"Initial Catalog={BaseDatos}; " +
                                                     $"AttachDBFilename={DBFilename}; " +
                                                     $"Integrated Security=true;";
    
            static CadenaConexion()
            {
                string appPath = Path.Combine(Application.StartupPath, @"conf\conf.txt");
                
                Servidor = File.ReadAllLines(appPath)[0];
                BaseDatos = File.ReadAllLines(appPath)[1];
                Usuario = File.ReadAllLines(appPath)[2];
                Password = File.ReadAllLines(appPath)[3];
                DBFilename = File.ReadAllLines(appPath)[4];
            }
    }

    Y con esto, puedes suprimir el método que había en el formulario inicial.

    Observa que te he cambiado los campos a readonly. Esto vale si la inicialización la haces desde el constructor. Pero si la hicieses a través de propiedades públicas entonces no puedes hacerlo así. Tendrían que ser propiedades públicas de lectura/escritura para poder cambiarlas desde fuera.

    EDITADO: Por cierto, con este código que tenías escrito, el fichero se lee cinco veces. Merecería la pena leerlo una sola vez a una variable y luego leer desde ahí los cinco valores.


    martes, 12 de enero de 2021 17:37
    Moderador

Todas las respuestas

  • >  lo que intento hacer es pasar esos valores a la clase cadenaconexion, pero no puedo crear el constructor

    No, la clase static no puede tener un constructor. El motivo es que no hay que construirla. Al ser estática "siempre" está construida. Se le puede agregar un constructor estático, pero el constructor estático no puede ser llamado desde programa (el sistema garantiza que siempre se ejecute antes de usar la clase).

    Podrías desde el constructor estático llamar una funcionalidad similar a la que has metido en ese método que has llamado LeerConf.

    O podrías pasar los parámetros a tu clase estática mediante propiedades públicas estáticas, en lugar de tratar de hacerlo mediante un constructor.

    Por cierto, para hacer esto, todas las propiedades que has declarado como "const" no pueden ser const. Pero podrías cambiarlas a static readonly si solo las vas a inicializar desde el constructor.
    martes, 12 de enero de 2021 15:38
    Moderador
  • Hola Alberto, Gracias por responder, en caso de usar la primera opción desde el constructor estático, me surge la duda en el formulario de inicio del programa debería llamar primero al método que cargue los valores ? y si es la segunda opcion te agradeceria un ejemplo de como pasar mediante propiedades publicas estáticas  y no hay problema de cambiar a static readonly desde ya gracias.
    martes, 12 de enero de 2021 15:51
  • Hola Enzo,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    martes, 12 de enero de 2021 17:29
    Moderador
  •  en caso de usar la primera opción desde el constructor estático, me surge la duda en el formulario de inicio del programa debería llamar primero al método que cargue los valores

    No, no. Esta opción es en lugar de cargar estos valores en el inicio del programa. Dado que el sistema garantiza que el constructor estático se ejecuta antes de que hagas ninguna llamada a la clase, no se necesita que escribas nada en el inicio.

    Te quedaría más o menos así:

    public static class CadenaConexion
        {
            private static readonly string Servidor;
            private static readonly string BaseDatos;
            private static readonly string Usuario;
            private static readonly string Password;
            private static readonly string DBFilename;
    
            public static string ObtenerCadenaSql => $"Data Source={Servidor}; " +
                                                     $"Initial Catalog={BaseDatos}; " +
                                                     $"User Id={Usuario}; " +
                                                     $"Password={Password}; " +
                                                     $"AttachDBFilename={DBFilename};";
    
            public static string ObtenerCadenaWin => $"Data Source={Servidor}; " +
                                                     $"Initial Catalog={BaseDatos}; " +
                                                     $"AttachDBFilename={DBFilename}; " +
                                                     $"Integrated Security=true;";
    
            static CadenaConexion()
            {
                string appPath = Path.Combine(Application.StartupPath, @"conf\conf.txt");
                
                Servidor = File.ReadAllLines(appPath)[0];
                BaseDatos = File.ReadAllLines(appPath)[1];
                Usuario = File.ReadAllLines(appPath)[2];
                Password = File.ReadAllLines(appPath)[3];
                DBFilename = File.ReadAllLines(appPath)[4];
            }
    }

    Y con esto, puedes suprimir el método que había en el formulario inicial.

    Observa que te he cambiado los campos a readonly. Esto vale si la inicialización la haces desde el constructor. Pero si la hicieses a través de propiedades públicas entonces no puedes hacerlo así. Tendrían que ser propiedades públicas de lectura/escritura para poder cambiarlas desde fuera.

    EDITADO: Por cierto, con este código que tenías escrito, el fichero se lee cinco veces. Merecería la pena leerlo una sola vez a una variable y luego leer desde ahí los cinco valores.


    martes, 12 de enero de 2021 17:37
    Moderador
  • Gracias me fue de mucha ayuda
    martes, 12 de enero de 2021 22:26