2009-06-09 30 views
5

Attualmente sono circa due settimane e mezzo nella mia prima applicazione ASP.Net MVC, e finora mi piace.Mantenerlo ASCIUTTO in ASP.Net MVC

Questo progetto corrente è una porta di un progetto WebForms ASP.Net e sto cercando di mantenere le funzionalità. Tutto sta andando bene.

Tuttavia, mi ritrovo a ripetere ... me stesso.

Ad esempio, nella mia classe BaseController, nel mio BaseViewPage, nel mio BaseViewUserControl, e nel mio BaseViewMasterPage, ho il seguente codice:

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; 
    } 
} 

Ora, questo è non codice bello. Vorrei sistemarlo un po ', ma al momento, lo aggiusto in quattro punti. È stata, infatti, la fonte di un paio di bug, il che significava ripararlo nuovamente in tutti e quattro i posti.

Come suggeriresti di mantenere questo sistema ASCIUTTO? Si noti che entrambi questi oggetti devono essere mantenuti nella sessione per più di un paio di motivi.

+0

Suggerisco di spostare le stringhe magiche "UserID", "Applicazione", ecc. Alle costanti o utilizzare un wrapper oggetto fortemente tipizzato per l'oggetto di sessione. – Kane

risposta

4

Si potrebbe rimuovere il codice da BaseViewPage, BaseViewUserControl e BaseViewMasterPage. Tutti i dati utilizzati nel rendering delle viste possono essere passati a loro dal controller come viewdata che è già disponibile in tutte le viste. Questo centralizza il tuo codice almeno per la classe base del controller.

+0

Alcune delle viste logiche sono basate sull'oggetto CurrentUser. Nella maggior parte dei casi, non voglio passare questo dal controller. Cioè, voglio che l'Utente sia accessibile universalmente. –

+0

Se si dispone di alcuni dati necessari a livello globale, è sempre possibile allegare un ['ActionFilterAttribute'] (http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.aspx) a compilare i dati per ogni chiamata di azione, per controller o per ogni metodo di azione. –

4

In App_Code, creare una classe "BaseUtils" o somesuch, contenente tale funzionalità; allora è sufficiente per includere il riferimento è dove necessario ...

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"]; 

    } 


} 

e nella tua pagina,

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

E allo stesso modo per gli altri due metodi ...

4

Utilizzare 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 
    } 
}