2011-10-11 156 views
2

所以我會嘗試在這一個上扮演魔鬼的擁護者......最佳解決方案:擴展方法還是新類?

假設有一個框架可以爲2或3個不同的網站提供服務。框架的基本功能是處理對某個DB的所有調用。在進行數據庫調用時,網站會調用一個Framework DataSource對象並獲取一個通用的Framework數據對象。

現在,網站檢索特定於其需求的屬性/方法,我們有2個解決方案選項。

  1. 創建一個新的類,延伸或包裹所述通用數據對象, 暴露更多域友好性質&保持該新類的內部的任何域 特定功能。

  2. 而不是創建一個新的類,在框架內創建擴展方法來服務每個這些網站。因此,框架內包含的所有內容均爲 ,如果需要1天,可在網站 之間共享。

只是在此澄清會的例子: 屬性:

  1. NewObject.GetSiteSpecificProperty
  2. GenericObject.GetProperty( 「GetSiteSpecificProperty」)或GenericObject.GetSiteSpecificProperty()

方法

  1. NewObject.DoSomethingSpecificToThisWebsite()
  2. GenericObject.DoSomethingSpecificToThisWebsite()

所以,你會選擇什麼樣的解決方案呢? 1或2?

乾杯。

+0

您可以共享,而無需使用擴展方法的方法,推動共享的東西變成了一個框架一個基類。 – Joey

+0

你錯過了我要問的點,或者我沒有澄清我的問題。我不是問如何在網站之間共享信息,我的問題是什麼是針對此問題的最佳設計解決方案。 1或2?爲什麼? –

+0

好的,我只是指出擴展方法不是您在網站之間共享方法的唯一選擇,所以功能共享不應該作出決定。 FWIW我會選擇1,因爲它在使用它的地方保留了特定的功能。將可能需要共享的任何功能放入基類包裝類中。 – Joey

回答

1

在我看來,在設計框架時,您希望保留框架外的特定於解決方案的特定方面,並讓調用實體在可能的情況下處理。

現在我不太清楚你的框架將被用於多少個不同的網站\項目,但是與選項(2)一起使用意味着現在每當添加一個新網站時,框架現在需要去做爲了完成這個功能。以自定義的方式使用框架的工作應該由不是框架的網站來處理。如果這個框架增長到可以使用10個甚至100個網站,這將成爲一個絕對的噩夢來維護,你的框架看起來更像一個框架,更像是一個特定於解決方案的產品。與(1)一起是一個更清潔的解決方案。基本上儘可能保持您的框架可重用和解決方案不可知論。

如果您正在設計將許多不同的項目使用,並且被設計成有一段時間我建議你閱讀Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries (2nd Edition)

+0

我已經授予tke的答案,因爲它在理論方面更多,我一直在尋找。 KeithS的回答是一樣的好,如果可以的話會分裂。 我絕對也在(1)陣營,但只是想確認我正朝着正確的方向前進。 (2)看起來如此反OOP,以至於我無法理解它是一種可接受的解決方案。謝謝你們。 –

0

在我看來,這是一個更好的設計,創建一個基類,並使用替代您的網站特定的代碼。儘管他們可以這樣做,但它似乎並不像擴展方法是爲了這種類型的操作。

現在,如果您正在尋找一種在不同網站上使用共享框架獲取不同值的方法,那麼web.config似乎可以滿足這種需求。每個站點都有它自己的Web.Config,你可以在那裏填寫你需要的特定屬性值,並有一個函數來檢索這個值?

1

通常,如果你控制你正在擴展的類的來源,我會通過繼承來擴展它,而不是擴展方法。擴展方法非常適用於向不受控制的類添加自定義功能,如.NET內置函數(String,Enum,IEnumerable)和其他第三方對象。但是,它們可能很難組織,而且它們在技術上是靜態方法,您通常希望爲了啓動性能和內存佔用量而儘量減少這些方法。

你也可能發現自己在命名空間和方法解析中遇到了延長問題;假設您將擴展方法放入特定於站點的庫中。如果一個站點必須與另一個站點執行相同的站點特定的事情,那麼您必須在其他站點中包含一個包含擴展方法的站點的庫(公開您可能不希望代碼知道的其他內容,可能包含對象的重複項或擴展名),或克隆代碼(違反DRY)。

+0

嘿,我從來沒有真正想過太多關於靜態方法和啓動性能/內存腳印。這是典型的服務器這些日子現實的擔憂嗎? –

+0

這並不重要,尤其是因爲您的網站基本上是一項服務(預計會有高正常運行時間和很少的重新啓動)。但是,它會有一些效果。 – KeithS

+0

因此,比方說,緩存在服務器上如此失控,以至於每小時需要重新啓動網站靜態/擴展方法會造成問題? –

0

我會爲1,因爲它保持框架一般(和可重用)和特定功能的地方,如果我是一個維護程序員使用它的地方。

要共享功能,我會創建一個基類包裝類,特定的包裝派生自。