【发布时间】: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