2010-04-14 15 views
5

Estoy creando un proveedor de membresía personalizado para mi aplicación asp.net. También creé una clase separada "DBConnect" que proporciona funcionalidad de base de datos como Ejecución de instrucción SQL, Ejecución de SP, Ejecución de SP o Consulta y devolución de SqlDataReader, etc.Proporcionar funcionalidad de base de datos personalizada al proveedor de membresía de asp.net personalizado

He creado una instancia de clase DBConnect dentro de Session_Start of Global.asax y almacenado en una sesión. Más tarde, utilizando una clase estática, proporciono la funcionalidad de la base de datos en toda la aplicación utilizando la misma sesión. En resumen, estoy proporcionando un punto único para todas las operaciones de base de datos desde cualquier página asp.net.

Sé que puedo escribir mi propio código para conectar/desconectar la base de datos y ejecutar SP dentro de los métodos que necesito sobrescribir. Por favor, mire el código de abajo -

public class SGI_MembershipProvider : MembershipProvider 
{ 

......

public override bool ChangePassword(string username, string oldPassword, string newPassword) 
    { 
     if (!ValidateUser(username, oldPassword)) 
      return false; 

     ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true); 

     OnValidatingPassword(args); 

     if (args.Cancel) 
     { 
      if (args.FailureInformation != null) 
      { 
       throw args.FailureInformation; 
      } 
      else 
      { 
       throw new Exception("Change password canceled due to new password validation failure."); 
      } 
     } 

.....   

//Database connectivity and code execution to change password. 

} 

.... 

} 

MI PROBLEMA - Ahora lo que necesito es para ejecutar la parte de base de datos dentro de todos estos métodos sobrecargadas de la misma base de datos punto como se describe en la parte superior. Es decir, tengo que pasar la instancia de DBConnect existente en la sesión a esta clase, para poder acceder a los métodos.

¿Alguien podría dar una solución al respecto? Puede que haya algunas técnicas mejores que no conozco. El enfoque que estoy usando podría ser incorrecto. Tus sugerencias siempre son bienvenidas

Gracias por compartir su valioso tiempo.

Respuesta

4

Comprender el ciclo de vida del proveedor de membresía ayudaría a aclarar esto.

Una instancia del proveedor de membresía se activa cuando se inicia la aplicación y permanece activa durante toda la vida de la aplicación AppDomain, que en la práctica equivale al ciclo de vida de la aplicación. p.ej. Si, por alguna razón, el AppDomain realiza un ciclo, la aplicación se elimina y se genera una nueva instancia. Una nueva instancia del proveedor de membresía registrado se transfiere al primer uso.

Necesitas o bien crear una instancia de la clase que el acceso a datos dentro de sus implementación del proveedor de acceso o métodos estáticos de miembros de dentro de su proveedor. Prefiero usar una instancia.

Separar el proveedor de membresía de su acceso a los datos mediante la creación de singleton o guardarlo en la aplicación es un hack en mi opinión y solo generará dolor, pena, pérdida de sueño y credibilidad entre sus pares.

Saludos y buena suerte.

3

No mantenga una instancia separada de la clase DBConnect en sesión, ¡terminará creando una clase para cada usuario! Esto afectará seriamente la escalabilidad.

Usted puede hacer una de las siguientes:

  • Coloque la clase en el estado de aplicación
  • Uso del singleton pattern
  • hacer que la clase y todos los métodos de la clase estática.

Mi recomendación es ir a por el número 3. Usted no necesita generalmente para crear una instancia de una clase que las operaciones de base de datos, por ejemplo, crud

public static class DBConnect 
{ 
    public static ChangePassword(string userId, string password) 
    { 
    //Implementation here 
    } 
} 

A continuación, puede llamar a este código en su proveedor sin crear una instancia:

DBConnect.ChangePassword(x,y); 
+0

Gracias James! No hago exactamente lo mismo para el funcionamiento de la base de datos. Pero en lugar de ChangePassword() como miembro de DBConnect, necesito ejecutar una parte pequeña como SqlParameter [] p = new SqlParameter [3]; p [0] = new SqlParameter ("@ applicationName", applicationName); p [1] = new SqlParameter ("@ username", username); p [2] = new SqlParameter ("@ password", EncodePassword (newPassword)); bool retval = dbConn.ExecuteSP ("User_ChangePassword", p); dentro de Mi clase MembershipProvider. – IrfanRaza

+0

Ese código debe ir en db connect, los valores para los parámetros sql se deben pasar como parámetros en la función estática. No se preocupe, todo se ejecutará en el mismo proceso y las conexiones se agruparán en ado.net. –

Cuestiones relacionadas