2012-08-22 94 views
0

我們有像填充的下拉列表中,格式化許多常用功能Basewebpage類,返回格式化的數據表等..最好的方法從靜態返回新的對象/ isntance VS實例方法

這將是一個很好的方法。

Public Class BaseWebPage 
{ 
... 

    public static DataTable Static_GetPersonDataTable() 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("Name"); 
     dt.Columns.Add("Age"); 

     return dt; 
    } 
    ... 
    public DataTable NonStatic_GetPersonDataTable() 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("Name"); 
     dt.Columns.Add("Age"); 

     return dt; 
    } 
} 

這是怎麼都可以稱得上是上面的場景

  • DataTable dt1 = BaseWebPage.Static_GetPersonDataTable(); // calling static method 
    ... 
    BaseWebPage pageBase = new BaseWebPage(); 
    DataTable dt2 = pageBase.NonStatic_GetPersonDataTable(); // calling non-static method 
    

    幾個問題都將方法中返回一個DataTable的新實例或靜態總是會返回相同的?

  • 在重負載(許多請求)的情況下,會有任何線程相關的問題嗎?
  • 如果沒有比其他更好的副作用?爲什麼?

如果你可以寫一點描述性,它將是非常有用的。

回答

1

•這兩種方法都會返回一個數據表的新實例,或者靜態將始終返回相同的值嗎?

是的,他們會返回一個新的實例。

•在重負載(很多請求)的情況下,是否會有任何線程相關的問題?

否,除非您在方法中使用共享狀態。目前他們不,但他們可能。即使實例方法也可以使用共享狀態。這與靜態無關(靜態?)

•如果沒有副作用比其他更好?爲什麼?

這並不重要,但我會去實例方法。在某些時候,您可能想要添加測試,並且可以在界面中提取方法並模擬對象。

Bonus point: DataTables suck!避免它們並使用類/對象。

+0

我只是把Datatable例如,我們幾乎不使用它。然而,你可以建議一些鏈接或關於LINQ-to-SQL案例中的3層架構的一般格式好好表達,討論如何封裝類,方法,靜態變量和方法以及其他東西感謝很多stilgar –

+0

我想不出任何關於LINQ to SQL的3層架構的文章。我必須去Google,但你也可以這樣做。但是我可以推薦你使用MVP模式(有一個框架可以幫助你使用模式,但你可以很容易地實現模式),如果你正在使用Web窗體。另外,如果您可以使用.NET 4.5,則應該使用ModelBinders,如果不是,則應該將您的LINQ查詢包裝到ObjectDataSource中,並以這種方式與控件進行交互。 – Stilgar

+0

使用LINQ to SQL的一種合理方式是在請求啓動時創建一個DataContext並將其粘貼到HttpContext.Current.Items中(當然,您應該在方法中包裝對它的訪問),並在請求結束時進行處理。還有其他更高級的方式來管理數據上下文的生命週期,例如工作單元模式,但我經常發現它們是一種矯枉過正。 – Stilgar

1

就我個人而言,我會讓你所有的頁面成爲這個baseWebPage的子類。
您可以安全地訪問所有方法,而無需實例化BaseWebPage類,甚至可以輸入名稱(靜態時)。

代碼將OOK這樣的:
所有網頁(假設你使用的WebForms不MVC):

public partial class Index : BaseWebPage{ 
    protected void Page_Load(object sender, EventArgs e){ 
     var data = GetPersonDataTable(); 
    } 
} 

你baseWebPage:

Public Class BaseWebPage : System.Web.UI.Page{ 
    protected DataTable GetPersonDataTable(){ 
     //Do your thing 
    } 
} 

有關安全和行爲:這取決於你如何在這些方法中編寫你的代碼。
但是,在靜態和非靜態中,您都可以安全地使用多線程返回DataTable的多個不同實例。
如果有意的話,你也可以每次都返回相同的實例。這將取決於您使用的代碼和資源。

+0

這就是我們所做的。然而,我們有一個單獨的控制文件夾和所有控制文件在那裏。我們再次擁有BaseControlPage,我們從中獲取每個控件。但是接下來我們在BaseWebPage中沒有幾個通用方法需要在這些控制代碼背後調用,這就是爲什麼我們要保持這些通用方法是靜態的,以便我們可以通過BaseWebPage類名稱 –

+0

Aha來調用它。不是那麼重要,但對於優雅我不會混合那些2.我會創建一個名爲Helper的新靜態類,並從BasePage和常規方法調用助手的靜態方法 – Kristof

+0

我們也有靜態實用類。我們在baseweb頁面中的一些常規函數確實會調用數據庫來填充下拉列表,填充選中的列表框等,並且我們已經在BaseWebPage上創建了靜態BL對象,以便它可以在任何地方使用。只是爲了澄清我們的BL沒有任何成員變量和屬性只有方法調用DL方法和一些格式邏輯。實際的BL在存儲過程中 –

相關問題