使用VB.NET构建N层应用程序,分8步完成






3.53/5 (31投票s)
本文将向您展示如何使用VB.NET构建N层应用程序。
引言
许多人搜索关于如何分步使用VB.NET为Windows应用程序创建N层应用程序的文章或教程。在这篇文章中,我将一步一步地向您展示如何实现。我从我做的一个小型N层项目中举例。我包含了在各层之间传递数据的请求方法。这是一种很好的实践,并且在代码分层时易于维护。想象一下,将您的业务层、数据层放在表示层(您的VB窗体、ASP页面)中。您的代码将成为意大利面条代码,在维护时会耗费大量时间。在我们开始编码之前,让我们先看看什么是N层以及为什么使用它。
背景
N层是一种客户端-服务器架构,其中用户界面(表示层)、业务规则(业务逻辑层)、数据访问(数据层)被分离成独立的层,并独立维护和开发。应用程序将被分解成层。表示层将是您的窗体或ASP.NET页面,业务层将是负责在将数据发送到数据层之前检查业务规则是否被违反的类,而数据访问层将接收来自业务逻辑层的已验证数据,并在实际数据库上运行SQL命令。
阅读本文,我假设您知道如何
开始
确保您的表已就位并具有主键。因为如果您使用适配器,则无法更新没有主键的表,您只能进行选择。
第 1 步 (添加表示层和业务逻辑层)
在第一步中,我们将创建一个解决方案。您可以给它起任何有意义的名字。在我这里,我称之为“Pro_Client”。这将是您的表示层,用户将在此与我们稍后在文章中要使用的数据进行交互。这可以是一个Windows项目或一个Web项目,这无关紧要。
第 2 步 (添加表示层和业务逻辑层)
在解决方案资源管理器中,选择您的解决方案“Prop_Client”并右键单击。在菜单中,选择“添加”和“新建项目”。会出现一个“添加新项目”对话框,您必须选择“类库”,因为我们将使用此项目作为我们的业务逻辑层(BLL),并将其命名为“Prop_BLL”或任何有意义的名称,以表明它是BLL。将“Class1
”重命名为“clsPropertyBLL
”或其他有意义的名称。双击重命名的类或查看代码。您会注意到“Class1
”仍然存在。将其更改为有意义的名称,如果您处理的是员工,请使用“Employees”,在我这里是“Properties”。您的BLL就完成了,我们稍后会再回到它。
第 3 步 (向解决方案添加数据访问层)
在这一步中,我们将把我们的数据访问层(DAL)添加到同一个解决方案中。选择您的解决方案“Prop_Client”并右键单击;在菜单中,选择“添加”和“新建项目”。会出现一个“添加新项目”对话框,您必须选择“类库”并将其命名为“PropDAL”或任何有意义的名称,以表明这是您的DAL。完成之后,删除DAL项目中的“Class1”,我们不会使用它。接下来是添加一个组件。对于初学者,您不会直接使用类。我希望您从工具箱中拖放一些适配器。现在要将组件添加到我们的DAL中,您必须右键单击DAL项目(在我这里是“PropDAL”),选择“添加”和“添加组件”,并为其指定一个有意义的名称;在我这里,我将其命名为“Property_DAL”。双击该组件,您将看到组件的名称与类名相同。使用您在BLL中使用的类名,在我这里是“Properties”。这意味着您组件中的代码将如下所示。
Public Class Properties
Inherits System.ComponentModel.Component
End Class
现在我们的解决方案看起来像
第 4 步 (添加数据访问层组件)
在这一步中,我们将添加一个适配器。在您的DAL项目上,双击组件“Property_DAL”(在我这里),然后选择工具箱中的“DATA”部分。在工具箱中,选择 SQLdataAdapter
,然后会出现适配器对话框。单击“下一步”,选择连接。请注意,如果您是第一次执行此操作,则需要创建一个连接,就像在这个示例中一样。建立连接后,单击“下一步”。在“查询类型”中,目前,让我们选择“使用 SQL 语句”,然后单击“下一步”。您会得到一个区域,您可以在其中键入 SQL 语句,或者使用查询生成器让 Visual Studio 为您生成查询。让我们输入我们的 SQL 语句,如下所示
select * from Clients where Client_name = @Clientname
这是一个参数化查询。有时我们在运行时不知道要显示什么,并且可能决定在运行时显示其他内容。在这种情况下,我们使用参数化查询。上面的 SQL 查询将是适配器中的 commandtext。完成后,您将单击“下一步”,然后会出现关于您的适配器的报告。如果您在“更新”上看到一个黄色的感叹号,您应该知道这可能是因为您没有在表中设置主键。如果没有适配器中的错误,请单击“完成”,您的适配器就会为您创建,并注意 Connection 对象将出现在您的组件上。右键单击并将连接对象重命名为“cnProperties
”,并将适配器重命名为“daProperties
”。如果您使用的是 SQL,请在连接的属性中,单击“连接字符串”,在用户 ID 之后输入密码,您的连接字符串将如下所示
user id=sa; Password=topman;data source=Myserver;persist security info=False;initial catalog=ValRollClients
下一步是右键单击适配器“daProperties
”并生成一个数据集。将您的数据集命名为“dsProperties
”,并选中“将此数据集添加到设计器”选项,以便在组件上方直观地看到它;然后单击“确定”。
现在一切都设置好了。我们的数据源没问题了,让我们回到表示层。
第 5 步 (表示层)
现在,在此步骤中,我们需要做一些小的调整。首先,将一个 DataGrid
添加到您的窗体中,并将其命名为 dgproperties
,然后添加四个按钮,如下所示
别忘了将您的窗体重命名为“frmsearch
”。
第 6 步 (数据访问层中的函数)
让我们再次回到我们的 DAL 项目。我们将从 DAL 向 BLL 提供数据,BLL 将数据提供给前端(PL)。
现在让我们创建一个函数,该函数将返回一个 DataSet
并接受一个参数。双击您的组件,并在类中输入以下代码。
Public Function Getdat(ByVal strname As String) As dsProperties
Dim dsdata As dsProperties
Try
dsdata = New dsProperties
'We are Accepting an input parameter
daproperties.SelectCommand.Parameters("Clients").Value = strname
'filling the dataset
daproperties.Fill(dsdata)
Catch Throw
'In this Layer we dont Display Error or Exceptions. BLl will take care of that
'we are throwing the Exception to be handled by the Calling Function End Try
'Here we are returning a dataset filled with requested data
Return dsdata
End Function
请记住,我们也必须保存更改,所以我们将创建另一个 Sub 过程来将更改保存到数据库。因此,在您的组件类中,创建这个子过程。在第一个之后,如下所示
Public Sub SaveData(ByVal dsdata As dsProperties)
Try
daproperties.Update(dsdata)
Catch
Throw
'In this Layer we dont Display Error or Exceptions. BLl will take care of that
'we are throwing the Exception to be handled by the Calling Function
End Try
End Sub
现在所有内容都已添加到我们的 DAL 中,所以我们将调用 BLL(业务逻辑层)中的这个函数和 Sub 过程。
第 7 步 (在业务逻辑层中调用数据访问层函数)
现在,当业务逻辑层从表示层请求数据时,我们将调用 DAL 函数。转到 BLL 项目,双击“clsPropertyBLL
”以查看代码。我们需要创建的第一个是请求 DAL 数据的函数,以及一个将数据发送到 BLL 的保存函数,以及一些业务规则检查,然后才能保存到实际数据库。在我们开始编码之前,请为 BLL 添加对 DAL 的引用。右键单击 BLL,选择“添加引用”,在对话框中,选择“项目”选项卡,然后单击您的 DAL 项目,然后单击“确定”。
在 BLL 的类属性中,添加以下代码
Public Function GetData(ByVal strname As String) As Prop_DAL.dsProperties
Dim dsdata As Prop_DAL.dsProperties
'Creating an Object of a Class Properties in the Dal layer
Dim objgetdal As Prop_DAL.Properties
Try
dsdata = New Prop_DAL.dsProperties
objgetdal = New Prop_DAL.Properties
'Calling the Function of DAL and Passing Arguments to the Function
dsdata = objgetdal.Getdata(strname)
If dsdata.Tables("Clients").Rows.Count = 0 Then
MsgBox("No record with that Name was Found")
Else
'return a dataset with Data
Return dsdata
End If
Catch ex As SqlClient.SqlException
Throw ex
End Try
End Function
下一个 Sub 应该用于保存,我们需要一个 Sub 来检查业务规则是否被违反。
Public Function SaveData(ByVal dsdata As Prop_DAL.dsProperties) As Prop_DAL.dsProperties
Dim objDal As Prop_DAL.Properties
Try
objDal = New Prop_DAL.Properties
Me.CheckRules(dsdata)
'saving the Data
objDal.SaveData(dsdata)
Catch ex As Exception
End Try
End Function
在上面的函数中,我们将使用一个将在下面解释的 Sub 来检查规则。如果规则未被违反,那么我们可以通过 DAL 对象“objDAL
”调用 DAL 函数来保存数据。以下代码用于检查业务规则。
Private Sub CheckRules(ByVal dsdata As Prop_DAL.dsProperties)
Dim strMsg As String
Dim row As Prop_DAL.dsProperties.ClientsRow
'Iterating through the Dataset and Checking the Rules
For Each row In dsdata.Clients.Rows
If row.RowState = DataRowState.Added Or _
row.RowState = DataRowState.Modified Then
'Start Checking the Rules now
If row.Client_Name.Trim = "" Then
MsgBox("Name Cannot be Empty")
End If
If row.Client_Address = "" Then
MsgBox("Address Cannot be Empty")
End If
If row.Client_ID.ToString.Length > 13 Then
MsgBox("ID number must less than 13")
End If
End If
Next
If strMsg <> "" Then
'throw a new ApplicationException
'with our Custom Error message in it
Throw New ApplicationException(strMsg)
End If
End Sub
一切都已完成,您的 BLL 现在可以与您的 DAL 通信,并且您的 PL 将通过您的 BLL 与您的 DAL 通信。接下来是调用 PL 中的 BLL 函数。在 PL 项目中添加对 BLL 项目的引用,就像我添加对 DAL 的引用到 BLL 项目一样。
第 8 步 (从表示层调用业务逻辑层函数)
这是我们文章的最后一步。在这一步中,我们将调用 BLL 函数。首先,双击您的窗体,并声明一个模块级别的数据集,如下所示
Public Class Form1
Inherits System.Windows.Forms.Form
Dim mdsProperty As Prop_DAL.dsProperty
请注意,这不应该在您的 Form Load 事件内部,而应该在外面,因为它是一个模块级别的声明。在您的搜索按钮上,插入以下代码
Dim objBll As Prop_BLL.Properties Dim strsearch As String = CStr(txtsearch.Text)
btnClear.Enabled = True
Try
mdsProperty = New Prop_DAL.dsProperty
objBll = New Prop_BLL.Properties
mdsProperty = objBll.GetData(strsearch)
'Binding the Datagrid
dgProperties.DataMember = "Clients"
dgProperties.DataSource = mdsProperty
Catch ex As SqlClient.SqlException
Messagebox.Show(ex.Message)
End Try
在 Clear 按钮的代码中,您将输入以下代码来清除网格。
mdsProperty.Clear()
btnClear.Enabled = False
最后一个按钮是退出按钮,您可以输入自己的代码来退出应用程序或窗体。现在,您的 N 层应用程序应该在 8 个步骤中完成了。
结论
将您的应用程序设计为 N 层应用程序有助于您跟踪 bug,并能轻松地改进您的应用程序,而不是试图在一个混合了所有东西的应用程序中跟踪一个小的 bug。我希望从任何有建议并且对 N 层应用程序有更多知识的人那里学习。我的下一篇文章将是关于 Web 服务。我想通过构建一个使用 Web 服务的 Windows N 层应用程序示例来拓宽这个主题。对于认识我的人来说,您知道这不是我的第一篇文章。感谢您发来的所有电子邮件,询问有关文章以及如何在您的情况下实现它的问题。如果您喜欢这篇文章,请为它投票并给我发送电子邮件至