应用层直接引用数据层

时间:2013-07-01 16:57:26

标签: vb.net design-patterns

根据我的经验,应用层应引用业务层,业务层应引用数据层。我想对应用程序进行更改,以便应用程序层直接引用数据层,如下所示:

    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。哪个选项更合适?我想它在某种程度上取决于问题领域。

3 个答案:

答案 0 :(得分:1)

如果您有直接调用数据层的正当理由,请执行此操作。如果您在业务层中添加了传递函数,那么您所做的就是添加更多代码而没有明显的好处。

现在,如果您的业务层是通过接口公开的,例如 IBusinessLayer ,那么就为它添加一个 ProcessAllPersons()函数并让它直接将调用传递给数据层更有意义和一致性。这就是我的建议。

答案 1 :(得分:0)

  

业务层应引用数据层

这是一种方法,但如果您的目标是模块之间的最大分离,并且能够轻松更改数据访问层而无需触及业务层(这称为Persistence Ignorance),这可能是最好的方法。 / p>

看看洋葱建筑和/或六边形建筑。这些架构风格强调您的业务层是系统的核心,独立于任何其他层。

具体来说,它如何工作是为业务核心中的数据访问对象定义抽象,这些对象将在外围模块中实现并且使用由应用层。

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

答案 2 :(得分:0)

如果您无意更改数据库提供程序,并且您具有业务层可以保护开发人员的ADO.net技能,那么您不需要业务层。

但是,您要将业务逻辑放在哪里?