2009-06-09 17 views
5

Actualmente llevo aproximadamente dos semanas y media en mi primera aplicación ASP.Net MVC, y hasta ahora, me encanta.Manteniéndolo SECO en ASP.Net MVC

Este proyecto actual es un puerto de un proyecto ASP.Net WebForms, y estoy tratando de mantener la funcionalidad. Todo va bien

Sin embargo, me encuentro repitiendo ... a mí mismo.

Por ejemplo, en mi clase BaseController, en mi BaseViewPage, en mi BaseViewUserControl, y en mi BaseViewMasterPage, tengo el siguiente código:

protected LanLordzApplicationManager AppManager 
{ 
    get 
    { 
     if(Session["Application"] == null) 
     { 
      Session["Application"] = new LanLordzApplicationManager(Server.MapPath("~/")); 
     } 

     return (LanLordzApplicationManager)Session["Application"]; 
    } 
} 

protected User CurrentUser 
{ 
    get 
    { 
     if (Session["UserID"] == null && this.Request.Cookies["AutoLogOnKey"] != null && !string.IsNullOrEmpty(this.Request.Cookies["AutoLogOnKey"].Value)) 
     { 
      this.CurrentUser = this.AppManager.RecallUser(this.Request.Cookies["AutoLogOnKey"].Value, Request.UserHostAddress); 
     } 

     if (Session["UserID"] == null) 
     { 
      return null; 
     } 
     else 
     { 
      return this.AppManager.GetUserByUserID((long)Session["UserID"]); 
     } 
    } 
    set 
    { 
     Session["UserID"] = value.UserID; 
    } 
} 

Ahora bien, esto es, no código hermoso. Me gustaría arreglarlo un poco, pero a partir de ahora, lo estoy arreglando en cuatro lugares. Ha sido, de hecho, la fuente de un par de errores, lo que significaba volver a arreglarlo en los cuatro lugares.

¿Cómo sugeriría que mantuviera este sistema SECO? Tenga en cuenta que estos dos objetos deben mantenerse en la sesión por más de un par de razones.

+0

Le sugiero que mueva sus cadenas mágicas "UserID", "Application", etc. a constantes o use un envoltorio de objetos fuertemente tipado para su objeto de sesión. – Kane

Respuesta

4

Se podría eliminar el código de BaseViewPage, BaseViewUserControl y BaseViewMasterPage. Todos los datos utilizados en la representación de las vistas pueden transmitirse desde el controlador como viewdata, que ya está disponible en todas las vistas. Esto centraliza su código al menos para la clase base del controlador.

+0

Parte de la lógica de vista se basa en el objeto CurrentUser. En la mayoría de los casos, no quiero pasar eso desde el controlador. Es decir, quiero que el Usuario sea universalmente accesible. –

+0

Si tiene algunos datos que necesita disponibles de forma más global, siempre puede adjuntar un ['ActionFilterAttribute'] (http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.aspx) a rellene los datos para cada llamada de acción, por controlador o por método de acción. –

4

En App_Code, cree una clase "BaseUtils" o somesuch, que contenga esa funcionalidad; a continuación, sólo tiene que incluir referencia a ella cuando sea necesario ...

public class BaseUtils 
{ 
    public static LanLordzApplicationManager getAppMgr() 
    { 
     HttpSession Session = HttpContext.Current.Session; 
     if(Session["Application"] == null) 
     { 
      Session["Application"] = new LanLordzApplicationManager(Server.MapPath("~/")); 
     } 

     return (LanLordzApplicationManager)Session["Application"]; 

    } 


} 

y en su página,

protected LanLordzApplicationManager AppManager 
{ 
    get 
    { 
     return BaseUtils.getAppMgr(); 
    } 
} 

y lo mismo para los otros dos métodos ...

4

¡Utilice Mixins!

interface IWebRequestable { 
    HttpWebRequest Request {get;} // Right class? Not sure. 
} 

public class BaseUserControl : UserControl, IWebRequestable {} 
public class BaseController : Controller, IWebRequestable {} 
public class BasePage : Page, IWebRequestable {} 

public static class CurrentUserMixin { 
    public static User GetCurrentUser(this IWebRequestable RequestObject) { 
     // Put your User code here 
    } 
}