【问题标题】:.NET Design Patterns (tiers).NET 设计模式(层)
【发布时间】:2012-07-29 19:19:09
【问题描述】:

我支持并开发一个大型 ASP.NET 应用程序(我是一个单独的开发人员)。我正在尝试通过使用设计模式来采用结构化的编码方法,但我还没有完全掌握这个主题。我正在考虑使用 MVP 模式作为用户界面和数据层来分离业务逻辑和数据逻辑(总共两种模式)。例如,看看下面的代码:

Imports System.Data.SqlClient
Imports System.Web.Configuration
Partial Class _Default
    Inherits System.Web.UI.Page

    Private _ConString As String

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            If Session("OrderID") > " " Then 'Line 10
            Dim objDR As SqlDataReader
                _ConString = WebConfigurationManager.ConnectionStrings("TestConnection").ConnectionString
                Dim objCon As New SqlConnection(_ConString)
                Dim objCommand As New SqlCommand
                objCommand.CommandText = "SELECT * FROM Person WHERE ID = " & session("id") 'I know this could cause SQL injection attacks.  I wrote it quickly to get my point accross
                objCon.Open()
                objCommand.Connection = objCon
                objDR = objCommand.ExecuteReader
                Do While objDR.Read
                    MsgBox(objDR("name"))
                Loop
                objDR.Close()
    End If
        Catch ex As Exception
            Throw
        End Try
    End Sub
End Class

这违反了很多 SOLID 规则。表现层有数据逻辑和业务逻辑(第10行是业务逻辑)。

我正在考虑创建两个新类,即 PersonDAL(用于数据访问层)和 PersonBLL 用于业务逻辑层。业务逻辑层和数据访问层将具有相同的函数名称,即 getPerson(),即表示层将调用 BLL 层中的 getPerson,而后者将调用 DAL 中的 getPerson。我的问题是:这是一个好的方法还是有更好的方法将此功能分解为层?

我查看了以下链接,其中讨论了使用数据集时的这种方法,但我没有使用数据集,即我使用的是 SQLCommands 和 SQLDataReaders:http://msdn.microsoft.com/en-us/library/aa581779.aspx

【问题讨论】:

  • session("ID") 返回的函数是什么?如果它不是 int,您可能会受到 sql 注入攻击。您应该使用参数。
  • @Scott Chamberlain,谢谢。我在实时系统中使用参数化查询来避免 SQL 注入攻击。出于演示目的,我快速编写了上面的代码。

标签: asp.net .net design-patterns


【解决方案1】:

我们的应用程序已经投入生产 8 年以上,使用这种精确的层结构,最初是基于 Microsoft 参考应用程序设计的。

这种分层系统使我们能够轻松添加 Web 客户端、服务接口(用于处理传入的电子邮件)、win forms 客户端、windows 平板电脑客户端,并且最近支持几乎直接端口到 mono 以创建 iPad 客户端。

所有客户端共享 BLL 并通过 .Net 远程处理或 WCF 与 DAL 通信。这种方法还允许我们将 Web 客户端和 DAL 分布在多个物理服务器上,以便处理大量用户。

【讨论】:

  • 谢谢。业务逻辑层和数据逻辑层中的类之间是否存在一对一的关系?例如,如果您有一个类 (StudentBLL) 和另一个从 Student (UndergraduateBLL) 继承的类,那么即使本科BLL 只需要使用 StudentDLL 中的函数,您是否总是有两个数据逻辑类,即 StudentDLL 和 UndergraduateDLL。
  • 不,我们的数据访问层实际上有点通用。我们的类负责应用程序的各个逻辑部分(即 ListSystem 用于列表相关活动),这些部分包含特定于该区域的方法。而且 DAL 中的大多数方法都相当小,因为我们严重依赖反射来自动将数据移入和移出数据库。我们的规则是存储在数据库中的任何类属性必须与数据库中的列同名。这样我们就可以用一行代码将整个类移入或移出表
  • 谢谢。公平地说,您的 DAL 具有独立的结构,即独立于 dal 吗? dal中有继承和多态吗?
  • 构成 DAL 的类仅以有限的方式使用继承和多态性(主要是为了抽象数据库接口;我们必须支持 SQL Server、Oracle、Microsoft Access、SQLCE 和 Sqlite)。但是,DAL 消费的 BLL 广泛使用 I&P。
  • 为了支持大量的用户和大量的客户端,你可以说分离层吗?我没有这个要求。我正在尝试使代码更具可读性和可扩展性。不过我不想浪费时间。
猜你喜欢
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2015-09-19
  • 2015-02-27
相关资源
最近更新 更多