2009-09-23 4 views
1

Dans ASP.Net Web Forms, il y a des cas que j'ai rencontrés pour créer du code dépendant d'une commande. Comme une odeur de code évidente je cherche des solutions pour résoudre ce problème.Comment éliminer ces dépendances d'ordre de mon code

Un exemple pseudo-code serait:

appelle le code :: Page.aspx

protected void Page_Load(...) { 
    var control = LoadControl("ControlX.ascx"); 

    // Ugly since the control's constructor is not used by LoadControl 
    control.SetDependencies(...); 
} 

Control Code :: ControlX.ascx

public void SetDependencies(...) { 
} 

protected void Page_Load(...) { 
    if (dependencies are null) 
     throw Exception(); 
    else 
     ContinueProcessing(); 
} 

LoadControl a deux signatures, le one used above accepte une chaîne pour le contrôle c lasse l'emplacement physique et crée correctement les contrôles enfants. Alors que second signature accepte la classe de contrôle en tant que type de classe, et tous les paramètres pour le constructeur, cependant les contrôles enfants sont pas créé comme détaillé dans TRULY Understanding Dynamic Controls. Alors, comment puis-je éliminer cette dépendance d'ordre de la manière la plus propre? Ma première pensée est que si j'ai créé dynamiquement les contrôles enfants dans ControlX, mais cela peut être lourd pour les contrôles plus importants. Pensées?

Répondre

3

(je l'espère, dans compris le problème correctement) Vous pouvez inverser la dependecy comme ceci:

L'hôte de ControlX.ascx (soit un autre contrôle ou une page) doit mettre en œuvre une certaine interface (définie par controlX). ControlX peut alors accéder à ses dépendances depuis son hôte via cette interface.

Un petit exemple serait:

public interface IControlXHost 
{ 
    // methods, properties that allow ControlX to access its dependencies 
    int GetStuff(); 
} 

public partial class ControlX : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     var host = (Parent as IControlXHost) ?? (Page as IControlXHost); 
     if (host == null) { 
      throw new Exception("ControlX's parent must implement IControlXHost"); 
     } 
     else { 
      int number = host.GetStuff(); 
     } 
    } 
} 

L'hôte (la page ou le contrôle d'hébergement controlX) devrait alors mettre en œuvre cette interface, par exemple:

public partial class Default4 : System.Web.UI.Page, IControlXHost 
{ 
    public int GetStuff() { 
     return 33; 
    } 

    protected void Page_Load(object sender, EventArgs e) { 
     var control = LoadControl("ControlX.ascx");  
    } 
} 

OMI, cette approche rend les contrôles plus faciles à réutiliser, car ils vous indiquent "automatiquement" les exigences qui doivent être remplies pour héberger le contrôle. Vous n'avez pas besoin de savoir quelles méthodes du contrôle vous devez appeler dans quel ordre.

+0

Oui, vous avez bien compris. C'est certainement quelque chose qui fonctionnerait. –

Questions connexes