2011-05-18 85 views
0

我重構一些代碼,我得到了到這樣的做法:從其他類訪問頁面上的頁面/控件的最佳實踐?

protected void Page_Init(object sender, EventArgs e) 
{ 
    Logger.Info("Page Initialization."); 
    //Provides highlighting/docking functionality at the start, but overshadows controls in more complex scenarios. 
    RadDockZone1.Visible = (RadControlStates.SplitterStates.Count == 0); 

    ControlRegeneration.RegenerateReportMenu(lstBxHistorical, lstBxCustom); 
    ControlRegeneration.RegeneratePaneChildren(RadPane2); 
    ControlRegeneration.RegenerateDockZones(Page); 
    ControlRegeneration.RegenerateDocks(RadDockLayout1, RadDock_Command, UpdatePanel1); 
} 

我想知道,如果它是很好的做法,通過頁和頁面控制,以這樣的其他功能。

我正在考慮創建一個單例,它將持有對相關頁面控件的引用,然後通過該實例訪問控件。

喜歡的東西...

public class DashboardPageControlsRepository 
{ 
    private static readonly DashboardPageControlsRepository instance = new  DashboardPageControlsRepository(); 

    private DashboardPageControlsRepository() { } 

    private Control myPanel; 

    public static DashboardPageControlsRepository Instance 
    { 
     get { return instance; } 
    } 

    public void SetPageState(Page page) 
    { 
     myPanel = Utilities.FindControlRecursive(page, "UpdatePanel1") 
    } 

    public Control Panel 
    { 
     get { return myPanel; } 
    } 
} 

然後,頁面初始化期間任何事情之前發生了,我會去和搶我的所有控件 - 讓我經過這裏訪問他們,而不是將它們傳遞下去。

有關如何處理這個問題的任何想法?

回答

2

以這種方式創建單例的問題是,靜態實例將在AppDomain的生命週期中存在(直到它被回收)。最重要的是,訪問單例的多個請求將試圖獨立地改變單例的狀態。

此存儲庫提供什麼服務,而不是作爲控件引用的容器提供?

我想提到的另一件事是,不要過多地專注於您的方法,您應該考慮使用最少需要的方法進行方法設計。您目前有:

public void SetPageSize(Page page) 

在其方法是在訪問Controls收集System.Web.UI.Control類型的唯一真正感興趣。您可以將方法重新定義爲:

public void SetPageSize(Control control) 
相關問題