幾周前我問了這個問題,並收到了一些很好的答案:ASP.NET Class Library best practice。我現在有另一個問題。ASP.NET共享DLL
我遇到的問題是我已經繼承了一個ASP.NET應用程序,它包含了很多緊耦合和低內聚的類,這並不理想。我想與其他應用程序分享一些代碼。大多數代碼存在於一個類中,但是該類引用了其他類,並且這些類引用了其他類等等。有沒有什麼方法可以在一個類中共享代碼(引用其他類)?我能想到的唯一方法就是使用Web服務,但存在敏感信息。
幾周前我問了這個問題,並收到了一些很好的答案:ASP.NET Class Library best practice。我現在有另一個問題。ASP.NET共享DLL
我遇到的問題是我已經繼承了一個ASP.NET應用程序,它包含了很多緊耦合和低內聚的類,這並不理想。我想與其他應用程序分享一些代碼。大多數代碼存在於一個類中,但是該類引用了其他類,並且這些類引用了其他類等等。有沒有什麼方法可以在一個類中共享代碼(引用其他類)?我能想到的唯一方法就是使用Web服務,但存在敏感信息。
在這種情況下,唯一不錯的選擇是重構代碼。但是,您不必更改現有的類接口。您可以創建多個設計正確的新類,並替換原本設計不佳的類中的邏輯。然後,您可以重構原始類以在內部使用新類來執行功能。你不必一次完成這一切。當你發現你需要共享庫中的特定邏輯時,只需重構該邏輯並保持其餘部分不變。隨着時間的推移,你可以用這種方式重構整個事物。當然,除非這個數字不是那麼大,否則你一直都在世界上重構這頭野獸。但是,通常情況並非如此。
例如,假設您有以下過於簡化類:
Public Class OriginalBeast
Private _dependency As New Dependency()
Public Function Method1() As Integer
Return _dependency.Calculate(2)
End Sub
Public Function Method2() As Integer
Return _dependency.Calculate(2)
End Sub
' ...
Public Function Method1027() As Integer
Return _dependency.Calculate(1027)
End Sub
End Class
Public Class Dependency
Public Function Calculate(value As Integer) As Integer
Return value * 2
End Function
End Class
而且你要共享的邏輯OriginalBeast.Method2
在類庫,你需要的Dependency
類移動到類庫(並可能需要部分重構它)。然後,你需要創建一個包含剛剛從原來的野獸所需的方法的新類:
Public Interface INice
Function Method2() As Integer
End Interface
Public Class Nice
Implements INice
Public Sub New(dependency As IDependency)
_dependency = dependency
End Sub
Private _dependency As IDependency
Public Function Method2() As Integer Implements INice.Method2
Return _dependency.Calculate(2)
End Function
End Class
Public Interface IDependency
Function Calculate(value As Integer) As Integer
End Interface
Public Class Dependency
Implements IDependency
Public Function Calculate(value As Integer) As Integer Implements IDependency.Calculate
Return value * 2
End Function
End Class
然後,你就需要重構原始獸使用的類庫,而不是做邏輯本身:
Public Class OriginalBeast
Public Sub New()
_dependency = New Dependency()
_nice = New Nice(_dependency)
End Sub
Private _dependency As IDependency
Private _nice As INice
Public Function Method1() As Integer
Return _dependency.Calculate(2)
End Sub
Public Function Method2() As Integer
Return _nice.Method2()
End Sub
' ...
Public Function Method1027() As Integer
Return _dependency.Calculate(1027)
End Sub
End Class
顯然,現實世界的野獸從來都不是簡單的,它可能會需要大量的工作,甚至重構的一小部分,但我希望,給你什麼,我談論的想法。
謝謝,如果你在一個類中設計了一個函數(設計不佳),並且你想在類庫中分享它,那麼你肯定會重構整個類。你是否吞噬第二個代碼? – w0051977 2012-07-18 14:25:35
@ w0051977我更新了我的答案,舉例說明了我正在談論的內容。 – 2012-07-18 14:54:38
+1提供了一個完整的示例。 – w0051977 2012-07-18 17:19:58