2009-05-27 18 views
7

Tengo una aplicación escrita en vainilla ASP.NET que me gustaría transferir a ASP.NET MVC.ASP.NET MVC Session vs Global vs Cache

Yo, sin embargo, estoy confundido sobre el lugar correcto para persistir objetos. Necesito a persistir por un par de razones:

  1. me gustaría que todos tengan una conexión de base de datos única , envuelto en un "depósito" o "manager" objeto de estilo.
  2. Cada usuario tiene un objeto de usuario que necesita guardarse por sesión.

Normalmente, diría que el # 1 se guardará como un elemento estático en el Globals.asax que puede ser golpeado usando Global.Repository o similar.

Y normalmente diría que # 2 debería ser una propiedad con una tienda de respaldo de sesión en algún lugar de la clase base de las páginas.

Ahora, la razón por la que estoy confundido es porque he oído que las sesiones han cambiado en MVC, y Global.asax ya no tiene la misma clase. Además, el concepto de páginas se ha eliminado, por lo que agregar una propiedad a la clase base de un controlador parece ... incorrecto.

¿Qué dice yall?

Respuesta

10

Su base de datos iría en una clase base para sus controladores. Esta clase base debería extender el Controlador, y todos sus controladores deberían extender la clase base. Aquí hay un pequeño ejemplo:

public class BaseController : Controller 
{ 
    private AuthServices _auth; 
    private LogHelper _log; 
    private Repository _repository; 

    /// <summary> 
    /// <see cref="AuthServices"/> 
    /// </summary> 
    protected AuthServices Authorization 
    { 
     get { return _auth ?? (_auth = new AuthServices()); } 
    } 

    /// <summary> 
    /// <see cref="LogHelper"/> 
    /// </summary> 
    protected LogHelper Log 
    { 
     get { return _log ?? (_log = new LogHelper()); } 
    } 

    /// <summary> 
    /// <see cref="Repository"/> 
    /// </summary> 
    protected Repository Repository 
    { 
     get { return _repository ?? (_repository = new Repository()); } 
    } 
} 

Observe la creación de instancias vagas. Eso me permite colarme antes de ejecutar pruebas y configurar mis campos privados con burlas.

En cuanto a la sesión, su objeto Usuario aún se puede guardar en la sesión como en una aplicación ASP.NET tradicional. Casi todo sigue rondando (Respuesta, Caché, Sesión, etc.), pero algunos de ellos han sido envueltos con clases de System.Web.Abstractions para que se puedan burlar de las pruebas. Todos todavía se comportan de la misma manera, aunque no debe usar algunos de ellos en su rol tradicional (por ejemplo, no responda. Redireccione, devuelva un resultado de acción como RedirectToRouteResult que realice su redirección).

En cuanto al razonamiento detrás de sus preguntas ....

no el estrés en una única conexión db. Dependiendo de su implementación, incluso puede ser una mala idea, ya que las solicitudes pueden pisarse entre sí. Simplemente abra su conexión, úselo y deséchelo/ciérrelo cuando termine.

Además, uno de los mayores cambios que MVC trae es el rechazo del modelo con estado que tradicional ASP.NET intentó traer al desarrollo web. Todo ese framework y viewstate ya no existe (no prestes atención al hombre detrás de la cortina). Cuanto menos estado tengas, menos compleja y más robusta será tu aplicación web. Inténtalo, puede que te guste.

+1

"Observe la instanciación lenta. Eso me permite colarme antes de ejecutar las pruebas y configurar mis campos privados con burlas". ¿Por qué no usar IoC? –

+1

Pasos para bebés ...... Debería responder con un ejemplo de cómo hacer esto. – Will

+1

De hecho, uso la agrupación de conexiones. De todos modos, gracias. Esto es casi exactamente lo que estaba planeando, es bueno saber que estoy siguiendo bastante de cerca las mejores prácticas. –

2

Las sesiones no han cambiado en MVC. La clase GlobalApplication en Global.asax todavía existe, también. También existen páginas que le gustaría consultar un repositorio en un controlador en lugar de una página. Agregar una propiedad a una clase de controlador base está bien; Lo hago todo el tiempo.

4

Si usa sesiones, recomendaría tener una clase de sesión, de modo que solo necesita especificar el nombre de la cadena una vez en el código y esto le dará también IntelliSence.

public static class SessionHandler 
{ 
    // User Values 
    private static string _userID = "UserID"; 
    private static string _userRole = "UserRole"; 

    public static string UserID 
    { 
     get 
     { 
      if (HttpContext.Current.Session[SessionHandler._userID] == null) 
      { return string.Empty; } 
      else 
      { return HttpContext.Current.Session[SessionHandler._userID].ToString(); } 
     } 
     set 
     { HttpContext.Current.Session[SessionHandler._userID] = value; } 

    } 

    public static string UserRole 
    { 
     get 
     { 
      if (HttpContext.Current.Session[SessionHandler._userRole] == null) 
      { return string.Empty; } 
      else 
      { return HttpContext.Current.Session[SessionHandler._userRole].ToString(); } 
     } 
     set 
     { HttpContext.Current.Session[SessionHandler._userRole] = value; } 

    } 
} 
+0

Me gusta esto, pero se debería crear una instancia para cada Controlador. Preferiría que todos los controladores de una sesión compartan objetos basados ​​en sesiones, por lo que los ubicaré como propiedades en una clase BaseController. –

1

Puede crear un encuadernador de modelo para encapsular el estado.

(Ver el libro de Steve Sanderson MVC en su carrito de compras aplicación)

con el ligante modelo, se tiene acceso a la ControllerContext - que tiene la HttpContext.