2012-07-18 179 views
1

幾周前我問了這個問題,並收到了一些很好的答案:ASP.NET Class Library best practice。我現在有另一個問題。ASP.NET共享DLL

我遇到的問題是我已經繼承了一個ASP.NET應用程序,它包含了很多緊耦合和低內聚的類,這並不理想。我想與其他應用程序分享一些代碼。大多數代碼存在於一個類中,但是該類引用了其他類,並且這些類引用了其他類等等。有沒有什麼方法可以在一個類中共享代碼(引用其他類)?我能想到的唯一方法就是使用Web服務,但存在敏感信息。

回答

2

在這種情況下,唯一不錯的選擇是重構代碼。但是,您不必更改現有的類接口。您可以創建多個設計正確的新類,並替換原本設計不佳的類中的邏輯。然後,您可以重構原始類以在內部使用新類來執行功能。你不必一次完成這一切。當你發現你需要共享庫中的特定邏輯時,只需重構該邏輯並保持其餘部分不變。隨着時間的推移,你可以用這種方式重構整個事物。當然,除非這個數字不是那麼大,否則你一直都在世界上重構這頭野獸。但是,通常情況並非如此。

例如,假設您有以下過於簡化類:

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 

顯然,現實世界的野獸從來都不是簡單的,它可能會需要大量的工作,甚至重構的一小部分,但我希望,給你什麼,我談論的想法。

+0

謝謝,如果你在一個類中設計了一個函數(設計不佳),並且你想在類庫中分享它,那麼你肯定會重構整個類。你是否吞噬第二個代碼? – w0051977 2012-07-18 14:25:35

+0

@ w0051977我更新了我的答案,舉例說明了我正在談論的內容。 – 2012-07-18 14:54:38

+0

+1提供了一個完整的示例。 – w0051977 2012-07-18 17:19:58