2012-07-26 38 views
0

我有一個項目,其中包含一個繪製圖形的類。這個類看起來是這樣的: -如何創建一個可以使用兩個名稱空間之一的類?

using System.Web.UI.DataVisualization.Charting; 

namespace MyNameSpace 
{ 
    public static class Utilities 
    { 
     public static void DrawOnGraph (Chart ourChart, 
             // ...more parameters... 
             ) 
     { 
      ChartArea our_area = new ChartArea("Main"); 
      // Draw things 
     } 
    } 
} 

這是由包含在同一個解決方案的另一個項目中的Web應用程序驅動的。我現在需要創建一個表單應用程序,它將使用完全相同的輸入到Web表單上,精確繪製相同的圖表。我希望將該項目納入第二個解決方案。但類需要看起來像這樣: -

using System.Windows.Forms.DataVisualization.Charting; 

namespace MyNameSpace 
{ 
    public static class Utilities 
    { 
     public static void DrawOnGraph (Chart ourChart, 
             // ...more parameters... 
             ) 
     { 
      ChartArea our_area = new ChartArea("Main"); 
      // Draw things 
     } 
    } 
} 

我想知道是否有可能使用相同的項目/班/兩個代碼,我自然不想cut'n '將代碼粘貼到兩個不同的地方,唯一的區別是using指令。

我不明白我可以如何使用泛型,因爲(替代)名稱空間中的對象函數內部存在聲明,如上面顯示的ChartArea。我看不到使用條件編譯的方式,因爲需要哪一行取決於項目所在的解決方案,而不是項目本身,並且它不能引用調用方項目,因爲它會創建循環引用。我也不能將Web圖形投射到一個Windows圖表。

我已經能夠管理的最好的辦法是同時提供using指令,但根據我目前正在使用的解決方案評論其中的一個。但是這對我來說似乎並不令人滿意。有沒有更好的辦法?或者我應該不是那麼空閒並且將代碼寫兩次?

回答

1

一個是Web

using System.Web.UI.DataVisualization.Charting; 

另一種用於Windows

using System.Windows.Forms.DataVisualization.Charting; 

的問題是,他們將使用有關他們的平臺類,所以我不認爲你能實現它

我的建議是將通用功能分離到一個不依賴於Web或Windows的庫中,並將其用於兩個不同的解決方案重刑一個網絡,另一個用於窗戶,這樣alteast您減小了代碼重複兩次

更新:

另一種選擇是將其寫爲Windows控件庫,然後讓它在網上提供應用程序作爲DLL。請看這個例子http://www.beansoftware.com/ASP.NET-Tutorials/Place-Windows-Control-To-Web-Form.aspx

+0

感謝您的回答,但遺憾的是或多或少的都在函數使用某種形式的圖形相關的對象。 – 2012-07-26 10:23:15

+0

@BrianHooper只是出於好奇他們是來自這些命名空間 – HatSoft 2012-07-26 11:44:58

+0

@BrianHooper請參閱我的更新答案的UI輸出中有很大的差異,這可能幫助你 – HatSoft 2012-07-26 11:48:10

2

你可以在繪製邏輯之上創建你自己的抽象,並使用包裝模式封裝兩個圖表。然後,您將針對您的抽象進行編碼,併爲每個表單和Web項目提供實現。我認爲繪圖邏輯的複雜程度足以證明這種方法的合理性。如果你實現這個功能,它將允許你在一個地方引入圖形的變化,它會影響這兩個應用程序。

+0

感謝您的回答,但是如果我這樣做,是不是最終會有兩組類定義,它們只有'using'指令有所不同? – 2012-07-26 12:06:55

+0

基本上是的,但這些類將是非常海峽,並不會包含任何邏輯只是將參數傳遞給winforms或web實現。你所有的邏輯將被保存在調用你的外觀的單獨的類中。 – Rafal 2012-07-26 12:18:31

2

我能想到的最好的靈魂就是爲類創建包裝接口,System.Web.UI.DataVisualization.ChartingSystem.Windows.Forms.DataVisualization.Charting提供/需要。然後提供接口的兩個實現:一個用於表單,一個用於UI。有了這些,您的Utilities可以調用接口方法,而無需知道確切的實現,並共享UI和Forms的代碼。

1

您可以使用條件編譯如果你的代碼調用Web.UI和Windows.Forms的圖表各自的API,包括同系列,ChartArea等

操作的「相同」的部分只需將代碼編譯兩次:一次使用 Web.UI圖表和其他使用 Windows.Forms的圖表。使用條件編譯來啓用/禁用程序集引用,以便一個程序集針對基於WinForms和其他WebUI圖表應用程序的應用程序。

或者,在一些快速和骯髒的情況下,你可以只用Windows.Forms的圖表API獲得通過,並在任何需要的HTML,例如一個SRC屬性爲IMG元件,僅僅Chart.SaveImage(..),等使用。但是這有缺點。

這些替代品兩者都限制,因爲Web.UI和Windows.Forms的圖表各自的API和功能不重疊不夠。另外,SaveImage()也是有限制的,因爲您不希望您的Web應用程序受到Windows.Forms程序集和無關操作的影響。

儘管如此,條件編譯方法將工作,即使網頁和表格組件分歧。您將能夠維護共享代碼(但是爲網絡或表單有條件地編譯),但每個庫都會累積新的代碼,專用於其網絡或表單目標。這種方法最適合構建配置。如果你有一個很好的構建配置的方法,我認爲比其他方法更容易維護和擴展。

相關問題