2013-07-01 73 views
1

根據我的經驗,應用層應引用業務層,業務層應引用數據層。我想做出改變,以一個應用程序,使應用層引用直接在數據層如下:應用層直接引用數據層

Imports System.Data.SqlClient 

Public Class ApplicationLayerClass 

    Public Function ProcessAllPersons() 
     Dim data As New DataLayerClass 
     Dim list As List(Of Person) = data.getAllPersons() 
     For Each person In list 
      'Call this function from the application client. Do some complex work on the person here. 
     Next 
    End Function 
End Class 

Public Class DataLayerClass 
    Public Function getAllPersons() As List(Of Person) 
     Dim list As List(Of Person) = New List(Of Person) 
     Dim p As New Person 
     Dim objCommand As New SqlCommand 
     Dim strConString As String = "Data Source=IANSCOMPUTER;Initial Catalog=Test;Integrated Security=True" 
     Dim objCon As New SqlConnection 
     objCon.ConnectionString = strConString 
     objCon.Open() 
     objCommand.Connection = objCon 
     objCommand.CommandText = "select * from person " 
     Dim objDR As SqlDataReader = objCommand.ExecuteReader 
     If objDR.HasRows Then 
      Using objCon 
       Do While objDR.Read 
        p.Name = objDR("Name") 
        p.age = objDR("Age") 
        list.Add(p) 
       Loop 
      End Using 
     End If 
     Return list 
    End Function 
End Class 

Public Class Person 
    Public Name As String 
    Public age As String 
End Class 

我也可以在使用適配器模式(http://en.wikipedia.org/wiki/Adapter_pattern)即業務層創建一個類函數稱爲BusinessLayerClass.ProcessAllPersons,由ApplicationLayerClass.ProcessAllPersons調用並調用DataLayerClass.getAllPersons。哪個選項更合適?我想這在一定程度上取決於問題領域。

回答

1

如果您有直接調用數據層的正當理由,那就去做吧。如果您在業務層中添加傳遞函數,那麼您所做的只是增加了更多的代碼,而沒有明顯的好處。現在

,如果您的業務層通過接口暴露,IBusinessLayer例如,然後加入ProcessAllPersons()函數將其和具有它直接傳遞該呼叫到數據層更有意義和一致性。這是我會推薦的。

+0

謝謝。 +1。我相信你的兩個評論相互矛盾,即「如果你在業務層中添加了傳遞函數,那麼你所做的只是添加了更多的代碼而沒有明顯的好處」,並且「讓它直接將數據傳遞給數據層更有意義,更一致「。你能澄清嗎?謝謝。 – w0051977

+0

@ w0051977 ...如果您的業務層是作爲實例而不是抽象(接口)公開的,那麼您沒有與客戶端建立「契約」,因此添加一個函數僅用於將呼叫傳遞給您的數據層不好 - 國際海事組織。用接口公開業務層可以創建與客戶端的契約,併爲您提供更大的靈活性。我覺得這種方式更清潔,更面向對象,但在您的情況下可能不需要。 –

0

業務層應該引用數據層

這是一種方法,但可以說不是最好的,如果你的目標在你的模塊之間的最大脫鉤並能很容易地改變你的數據訪問層而不涉及業務層(這稱爲Persistence Ignorance)。

看看洋蔥建築和/或六角形建築。這些架構風格強調您的業務層是系統的核心,獨立於任何其他層。

具體而言,它的工作原理是你在你的業務的核心,這將是在外圍模塊實現由應用層使用定義抽象數據訪問對象。

http://jeffreypalermo.com/blog/the-onion-architecture-part-1/

http://alistair.cockburn.us/Hexagonal+architecture

http://blog.kamil.dworakowski.name/2010/08/from-layers-to-hexagon-architecture.html

0

如果你有沒有改變你的數據庫提供商的意圖和你有ADO.net技能,業務層將保護開發者,那麼你不」 t需要一個業務層。

但是,您打算如何放置業務邏輯?