2009-01-08 7 views
0

J'ai hérité d'un projet qui utilise le modèle suivant pour passer des paramètres du code derrière à la page ASPX. Je sais que c'est faux, mais je suis sur la clôture sur la meilleure façon de le refactoriser.Comment refactoriseriez-vous les membres de pages en code ASPX?

code

Derrière:

using System; 
using System.Web; 

namespace BadPassing 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     private Random rnd = new Random(); //Is this bad? 

     protected int numberOne; //this is bad 
     protected int numberTwo; //this is bad 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      numberOne = rnd.Next(100); 
      numberTwo = rnd.Next(100); 
     } 
    } 
} 

ASPX Page:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="BadPassing._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Bad Page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <a href="http://www.google.com/search?q=<%=this.numberOne %>%2B<%=this.numberTwo %>"> 
      Add <%=this.numberOne %> and <%=this.numberTwo %> using google. 
     </a> 
    </div> 
    </form> 
</body> 
</html> 

Ma compréhension est que le numberOne et numberTwo ne sont pas thread-safe, et pourrait causer un comportement incorrect si deux personnes chargées de la page à la le même temps. En outre, si la page comptait sur numberOne et numberTwo pour stocker des valeurs entre les publications, plusieurs utilisateurs simultanés provoqueraient des résultats inattendus.

Est-ce que je comprends pourquoi cette technique est si mauvaise, et si oui, comment refactoriseriez-vous ce code? Sur une note de côté, est-il incorrect de stocker des services sans état au niveau de la page (comme Random) en tant que variables membres de la classe de pages?

Répondre

4

Ce code est correct. Les variables membres sont instanciées à chaque chargement de la page, car une nouvelle instance d'une classe est créée à chaque chargement de page. Si les variables étaient statiques, alors seulement vous auriez des problèmes avec 2 personnes chargeant la page au même moment. Réfléchissez aux commandes que vous supprimez sur une page.

Ce sont des variables membres, mais elles n'ont pas de problème avec le chargement simultané de la page par des requêtes différentes.

+0

Merci. J'ai complètement mal compris le cycle de rendu ASPX. Cela clarifie beaucoup. –

1

Dans le cas normal, si deux utilisateurs chargent la page en même temps, ils utiliseront différentes instances de la page. Comme numberOne et numberTwo sont des variables d'instance, il n'y aura pas d'état partagé et pas de problème de thread.

0

Alors il ny a pas vraiment anyhting mal avec le code (comme déjà mentionné) si vous voulez factoriser, je ferais probablement quelque chose le long des lignes de

using System; en utilisant System.Web;

namespace BadPassing 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     private Random rnd = new Random(); //Is this bad? 

     protected int numberOne; //this is bad 
     protected int numberTwo; //this is bad 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      numberOne = rnd.Next(100); 
      numberTwo = rnd.Next(100); 
      searchLink.NavigationUrl = String.Format("http://www.google.com/search?q={0}%2B{1}", numberOne, numberTwo); 
      searchLink.Text = String.Format("Add {0} and {1} using google", numberOne, numberTwo); 
     } 
    } 
} 

puis sur votre page ASPX juste ajouter un contrôle <asp:hyperlink>

Questions connexes