2009-09-23 39 views
1

在ASP.Net Web窗體中,我遇到過創建與訂單相關的代碼的情況。作爲一種明顯的代碼味道,我正在尋找解決方案來解決這個問題。如何從我的代碼中消除這些順序依賴關係

的僞代碼示例將是:

長途區號:: Page.aspx

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

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

控制代碼:: ControlX.ascx

public void SetDependencies(...) { 
} 

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

LoadControl具有兩個簽名,one used above接受控件c的字符串確定物理位置並正確創建子控件。儘管second signature接受控件類作爲類類型以及構造函數的任何參數,但子控件是而不是,如TRULY Understanding Dynamic Controls中詳述的那樣創建。

那麼如何以最清潔的方式消除這種順序依賴性?我的第一個想法是,如果我動態地創建了ControlX中的子控件,但那對於較大的控件來說可能很麻煩。思考?

回答

3

(我希望理解的問題,正確的),你可以顛倒這樣的關係是不:

ControlX.ascx的主機(另一種控制或網頁)必須實現一定的接口(由ControlX定義)。然後,ControlX可以通過該接口從主機訪問它的依賴關係。

一個小例子是這樣的:

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

主機(頁面或託管ControlX控制),那麼就必須實現該接口,如:

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

IMO,這種方法使控制更易於重複使用,因爲它們會「自動」告訴您必須滿足的控制要求。您不必知道控制的哪些方法必須按順序調用。

+0

是的,你理解正確。這絕對是可行的。 – 2009-09-23 20:38:33