Asp.net中实现三层架构

lobby 2003-01-16 12:08:57
看到很多讨论Asp.net中三层架构的方法,以及Duwamish 例程,我觉得都不能称为三层架构或多层架构,只能称为面向对象的设计,因为:
业务层或数据存取层并不是独立运行的,不象传统的中间层一样,只运行一个实例。在Asp.net中,如果有十个页面访问业务层,就会产生10个业务层的实例。

所以说这种设计只是将业务规则以及数据存取封装起来而已,并不是真正的分布式处理,大家认为呢?
...全文
174 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwzwwz427 2003-09-23
  • 打赏
  • 举报
回复
当用户单击“编辑”按钮时,将引发 DataGrid 控件的 EditCommand 事件。使用此事件更改 DataGrid 控件的 EditItemIndex 属性。EditItemIndex 属性指定的行将与所有数据一起显示在文本框中。
为 EditCommand 事件创建事件处理程序。
在 Visual Basic 中,右击页并选择“查看代码”。在“代码编辑器”的左下拉框中选择 DataGrid1。在右下拉框中选择“EditCommand”。

-或-

在 Visual C# 中,单击 DataGrid1 控件。在“属性”窗口中,单击“事件”按钮以显示 DataGrid 事件的列表。双击 EditCommand 事件。

如下所示添加代码。
' Visual Basic
Private Sub DataGrid1_EditCommand(ByVal source As Object, _
ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
Handles DataGrid1.EditCommand
DataGrid1.EditItemIndex = e.Item.ItemIndex
DataGrid1.DataBind()
End Sub

// C#
private void DataGrid1_EditCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex = e.Item.ItemIndex;
DataGrid1.DataBind();
}
为 CancelCommand 事件创建事件处理程序。(有关添加事件处理程序的信息,请参阅第 2 步。)
当用户单击“取消”按钮时,将引发 DataGrid 控件的 CancelCommand 事件。使用此事件将 EditItemIndex 属性设置为 -1,以便将当前行再次显示为文本。如下所示添加代码。

' Visual Basic
Private Sub DataGrid1_CancelCommand(ByVal source As Object, _
ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
Handles DataGrid1.CancelCommand
DataGrid1.EditItemIndex = -1
DataGrid1.DataBind()
End Sub

// C#
private void DataGrid1_CancelCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex = -1;
DataGrid1.DataBind();
}
当用户单击“更新”按钮时,将引发 DataGrid 控件的 UpdateCommand 事件。该方法负责用 DataGrid 控件中的更改更新 AuthorData 数据集,并通过 XML Web services 将这些更改传递回数据库。为 UpdateCommand 事件创建事件处理程序。(有关添加事件处理程序的信息,请参阅第 2 步。)如下所示添加代码。
' Visual Basic
Private Sub DataGrid1_UpdateCommand(ByVal source As Object, _
ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
Handles DataGrid1.UpdateCommand
' update each of the fields in the dataset row
Dim i As Integer
For i = 1 To AuthorData.authors.Columns.Count
' Controls(0) returns a Control object, so it must be cast
' to TextBox.
Dim t As TextBox = CType(e.Item.Cells(i).Controls(0), TextBox)
Dim row As DataRow = AuthorData.authors(e.Item.DataSetIndex)
row(AuthorData.authors.Columns(i - 1).Caption) = t.Text
Next
' Update the database.
If Me.AuthorData.HasChanges() Then
Dim ws As New AuthorsWebClient.localhost.AuthorsService()
ws.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim diffAuthors As New AuthorsWebClient.localhost.authors1()
diffAuthors.Merge(Me.AuthorData.GetChanges())
ws.UpdateAuthors(diffAuthors)
AuthorData.Merge(diffAuthors)
End If
' Take the row out of edit mode and display the new data.
DataGrid1.EditItemIndex = -1
DataGrid1.DataBind()
End Sub

// C#
private void DataGrid1_UpdateCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
// Change the data in the dataset.
for (int i=1; i<AuthorData.authors.Columns.Count; i++)
{
TextBox t = (TextBox)(e.Item.Cells[i].Controls[0]);
DataRow row = AuthorData.authors[e.Item.DataSetIndex];
row[AuthorData.authors.Columns[i-1].Caption] = t.Text;
}

// Update the database.
if (AuthorData.HasChanges())
{
AuthorsWebClient.localhost.AuthorsService ws =
new AuthorsWebClient.localhost.AuthorsService();
ws.Credentials = System.Net.CredentialCache.DefaultCredentials;
AuthorsWebClient.localhost.authors1 diffAuthors =
new AuthorsWebClient.localhost.authors1();
diffAuthors.Merge(AuthorData.GetChanges());
ws.UpdateAuthors(diffAuthors);
AuthorData.Merge(diffAuthors);
}
DataGrid1.EditItemIndex = -1;
DataGrid1.DataBind();
}
需要配置项目的安全设置以便使用集成安全性。通过关闭匿名访问并打开模拟来执行此操作。有关更多信息,请参阅安全模型。

配置集成的 Windows 身份验证

若要为项目配置集成的 Windows 身份验证,需要使用“Internet 信息服务”工具更改项目文件并配置项目。

启动“Internet 信息服务”工具。可以从“控制面板”的“管理工具”中运行它。(有关启动此工具的更多信息,请参阅 Windows 帮助文档。)展开服务器的节点。
展开“默认 Web 站点”节点。
右击 AuthorsWebClient 的节点,并从快捷菜单中选择“属性”。
单击“目录安全性”选项卡。
单击“匿名访问和验证控制”节中的“编辑”按钮。
清除“匿名访问”复选框。
选中“集成的 Windows 身份验证”框。现在已配置了 XML Web services 目录。
返回 Visual Studio 中的项目,在解决方案资源管理器中双击 Web.config 文件。
在 <system.web> 标记后面的行中添加下面的标记,以便为 XML Web services 配置集成安全性。
<identity impersonate="true"/>
运行应用程序

在解决方案资源管理器中选择“AuthorsWebClient”,右击然后选择“设为启动项目”。
按 CTRL+F5 以运行应用程序。
在本节中,您在解决方案中添加了一个 ASP.NET Web 应用程序项目作为数据的浏览器界面。将 Web 窗体页连接到了在第一节中创建的 XML Web services,并使用了 DataGrid 控件创建用于显示和编辑数据的用户界面。

wwzwwz427 2003-09-23
  • 打赏
  • 举报
回复
创建用户界面
创建了用于数据访问的中间层业务对象并将其公开为 XML Web services 后,下一步是创建客户端界面。本演练中有两个方案:传统的 Windows 窗体和 Web 窗体页。两个方案在此示例中被创建为同一解决方案中的不同项目。

Web 用户界面选项
Web 界面有助于应用程序访问各种不同的客户机和浏览器。所有用户界面处理都在 Web 服务器上而不是在客户端完成。您将使用 Web 窗体页来创建一个 Web 界面,与上一节中创建的 Windows 界面一样,此界面访问同一个中间层业务对象。下列关系图突出显示要实现的客户端。

分布式应用程序中的 Web 客户端

创建 Web 窗体应用程序

在“文件”菜单上,指向“添加项目”,然后单击“新建项目”。
在“添加新项目”对话框中,在“项目类型”窗格中选择“Visual C# 项目”或“Visual Basic 项目”,然后在“模板”窗格中单击“ASP.NET Web 应用程序”。
在“位置”框中,输入 Web 服务器的名称和项目的名称 http://ServerName/AuthorsWebClient,然后单击“确定”按钮。
新项目添加到解决方案资源管理器。一个名为 WebForm1.aspx 的 Web 窗体页添加到项目中并加载到设计器中。

为前面创建的 ASP.NET Web 服务项目添加 Web 引用:
在解决方案资源管理器中,右击 AuthorsWebClient 项目,然后单击快捷菜单上的“添加 Web 引用”。
在“添加 Web 引用”对话框顶部的“地址”框中,输入 XML Web services 项目的发现文件的位置(http://服务器名/AuthorsWebService/AuthorsWebService.vsdisco),然后按 ENTER 键。
单击“添加引用”。
现在可以在应用程序中创建 authors1 数据集的实例。
将控件添加到 Web 页

从工具箱的“数据”选项卡中将 DataSet 对象拖到窗体上。出现“选择数据集”对话框。选择“TypedDataSet”并从“名称”列表中选择“AuthorsWinClient.ServerName.authors1”。一个 DataSet 对象被添加到组件栏中。
选择 DataSet 对象并将 Name 属性设置为 AuthorData。
从“工具箱”的“Web 窗体”选项卡中将 DataGrid 控件拖到窗体上。
在 DataGrid 控件的“属性”窗口中,将 DataSource 属性设置为 AuthorData,将 DataMember 属性设置为 authors。这些设置出现在这些控件的下拉列表中。DataGrid 的列标题被设置为 authors 表的列名称。
若要在 DataGrid 控件中支持就地编辑,需要添加一个“编辑、更新、取消”列,该列将包含一个 Edit 按钮。当用户单击此“编辑”按钮时,该行的内容将显示在文本框中,并且“编辑”按钮将被“更新”和“取消”按钮替换。添加此列的方法是:
单击“属性”窗口底部的“属性生成器”链接,然后选择对话框中的“列”选项卡。
在“可用列”窗格中展开“按钮列”项。
选择“编辑”、“更新”和“取消”,然后单击“添加”()按钮。
单击“确定”按钮。
为“编辑”、“更新”和“取消”按钮添加代码

右击窗体并选择“查看代码”。在 Page_Load 事件中添加填充 DataGrid 控件的代码,如下所示。这些代码创建 XML Web services 的实例,填充 AuthorData 数据集,并将此数据集绑定到 DataGrid 控件。每当页在往返行程后返回用户时,网格都将包含来自数据库中数据的全新副本。XML Web services Credentials 属性用于将您的身份传递给 XML Web services,该服务接着将它传递给数据库服务器。
注意 在本演练中,每当 Web 窗体页下载到客户端浏览器时,都会从数据库中检索 authors 表的新副本。这可能不能提供最佳性能。有关优化性能的其他方法的讨论,请参阅 Web 数据访问策略建议。
' Visual Basic
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim ws As New AuthorsWebClient.localhost.AuthorsService()
ws.Credentials = System.Net.CredentialCache.DefaultCredentials
AuthorData.Merge(ws.GetAuthors())
If Not Page.IsPostBack Then
Me.DataGrid1.DataBind()
End If
End Sub

// C#
private void Page_Load(object sender, System.EventArgs e)
{
AuthorsWebClient.localhost.AuthorsService ws =
new AuthorsWebClient.localhost.AuthorsService();
ws.Credentials = System.Net.CredentialCache.DefaultCredentials;
AuthorData.Merge(ws.GetAuthors());
if (! Page.IsPostBack)
{
DataGrid1.DataBind();
}
}
wwzwwz427 2003-09-23
  • 打赏
  • 举报
回复
创建中间层业务对象
您创建的业务对象将在 Web 服务器上运行,提供分布式应用程序所需的性能和可伸缩性。另外,您将把业务对象实现为 XML Web services,这样客户端可以使用标准 Internet 协议从任何平台与您的业务对象进行通讯。有关详细信息,请参阅使用 XML Web services 进行 Web 编程。

在本演练中,XML Web services 组件将保存数据连接和数据集定义。然后将添加 XML Web services 方法以公开此数据集,这使其他应用程序能够查看和修改此数据集。

ASP.NET Web 服务项目模板是基于 Web 的项目,旨在创建将其自身的接口公开为 XML Web services 的中间层组件。有关更多信息,请参阅 Visual Studio 中的 ASP.NET Web 服务项目。

XML Web services 将公开两个方法。第一个方法 GetAuthors 将从数据库返回数据集。第二个方法 UpdateAuthors 将用用户的更改更新数据库。创建了若干私有成员来实现这些方法。它们包括数据集定义、数据适配器、数据连接和若干从数据库中检索数据和更新数据库的命令对象。下面的关系图描述了 XML Web services。

创建 ASP.NET Web 服务项目

1 在“文件”菜单上,指向“新建”,然后单击“项目”以显示“新建项目”对话框。
2 根据要使用的语言,在“项目类型”窗格中选择“Visual Basic 项目”或“Visual C# 项目”,然后在“模板”窗格中选择“ASP.NET Web 服务”。
3 在“位置”框中,输入 Web 服务器的名称和项目名称 http://ServerName/AuthorsWebService,然后单击“确定”按钮。
提示 如果 Web 服务器在您的计算机上,可以使用服务器名称 LOCALHOST。
提示 如果在创建 ASP.NET Web 服务项目时遇到问题,请参阅“Web 访问失败”对话框。
4 项目 AuthorsWebService 就添加到解决方案中。Service1.asmx 的“组件设计器”出现在开发环境中。
5 在解决方案资源管理器中,双击 Service1.asmx 以选择它。
6 在“属性”窗口中,将 Service1 的“名称”属性设置为 AuthorsService。
7 在解决方案资源管理器中,右击 Service1.asmx 文件,选择“重命名”,将此文件重命名为 AuthorsService.asmx,以便与服务名相匹配。
在此组件中,您将创建与数据存储区的连接并通过数据集获取数据实例。

创建和配置数据库连接和数据集架构
您将向 XML Web services 添加两个对象:一个 SqlDataAdapter 对象和一个 SqlConnection 对象。连接对象创建到数据库的新连接,而数据适配器则查询数据库并将结果发送到 DataSet 对象中。数据适配器还用用户对数据集所做的更改来更新数据库。通过使用这个到数据库的连接,将创建一个数据集来保存在数据库中存在的信息的实例。此数据集稍后将在本演练中用来显示 Windows 窗体和 Web 窗体页中的数据。有关概述,请参阅分布式应用程序和数据集成介绍。

创建数据库连接和数据适配器

1 单击服务器资源管理器。
注意 默认情况下,服务器资源管理器在开发环境的左侧显示为一个垂直选项卡。如果看不到此选项卡,请单击“视图”菜单,然后选择“服务器资源管理器”。
2 在服务器资源管理器中,右击“数据连接”节点,然后从快捷菜单中选择“添加连接”。
3 在“数据链接属性”对话框的“连接”选项卡中,输入安装有 pubs 数据库的 SQL Server 的名称。如果在本地计算机上有 SQL Server,请输入 (local)。
4 为登录信息选择“使用 Windows NT 集成安全性”。
注意 如果在您的系统上没有设置集成安全性,请与网络管理员联系。
5 从列表中选择 pubs 数据库。
6 单击“测试连接”验证您提供的信息,然后单击“确定”建立连接。
一个新节点出现在服务器资源管理器的“数据连接”节点中。

注意 如果数据库连接失败,请与数据库管理员联系。
7 在服务器资源管理器中,展开新连接节点的节点,然后展开 Tables 节点。
8 找到 authors 节点并展开它以显示 authors 表中的字段。
9 使用 CTRL+鼠标单击,选择 au_id、au_lname、au_fname 和 city 字段。
10 将这些字段从服务器资源管理器拖放到设计图面上。SqlConnection 对象与 SqlDataAdapter 对象在设计器中成对出现。现在已建立了到数据库的连接,信息传输将由 SqlDataAdapter 对象处理。这些组件被配置为将包含 authors 表的数据集移入和移出数据库。
注意 本演练使用 SqlDataAdapter 对象,此对象已针对使用 SQL Server 7.0 或更高版本进行了优化。也可以使用 OleDbDataAdapter 对象,这是因为它更通用,并提供对任何与 OLE DB 兼容数据源的 ADO.NET 访问权。如果要连接的数据库不是 SQL Server 数据库,则项目系统会创建一个 OleDbDataAdapter 对象和一个 OleDbConnection 对象。
注意 在本演练中,已使用 authors 表中的一些列和所有的行填充了数据集。在生产应用程序中,通常通过创建只返回所需列和行的查询来优化数据访问。有关示例,请参阅演练:使用参数化查询在 Windows 窗体中显示数据。
需要配置项目的安全设置以便使用集成安全性。通过关闭匿名访问并打开模拟来执行此操作。有关更多信息,请参阅安全模型。

配置集成的 Windows 身份验证

若要为项目配置集成的 Windows 身份验证,需要使用“Internet 信息服务”工具更改项目文件并配置项目。

启动“Internet 信息服务”工具。可以从“控制面板”的“管理工具”中运行它。(有关启动此工具的更多信息,请参阅 Windows 帮助文档。)
展开服务器的节点。
展开“默认 Web 站点”节点。
右击 AuthorsWebService 的节点并从快捷菜单中选择“属性”。
单击“目录安全性”选项卡。
单击“匿名访问和验证控件”节中的“编辑”按钮。
清除“匿名访问”复选框。
选中“集成 Windows 验证”复选框。现在已配置了 XML Web services 目录。
返回 Visual Studio 中的项目,在解决方案资源管理器中双击 Web.config 文件。
在 <system.web> 标记后面的行中添加下面的标记以便为 XML Web services 配置集成安全性。
<identity impersonate="true"/>
创建数据集类定义

在解决方案资源管理器中,双击 AuthorsService 文件以在设计器中打开它。
从“数据”菜单中选择“生成数据集”。在“生成数据集”对话框中,选择“新建”并将数据集命名为 "authors1"。不要选中标签为“将此数据集添加到设计器。”的框。
注意 将创建数据集架构文件 authors1.xsd 并将其添加到项目。此架构文件包含 authors1 的类定义。该类(从 DataSet 类继承)包含 authors 表的类型化数据集定义。
从“文件”菜单中选择“全部保存”。
从业务对象中公开 authors1 数据集
本演练的下一步是从业务对象公开刚创建的数据集对象。此操作使数据集可供 Windows 或 Web 应用程序使用。

将方法添加到 XML Web services

在解决方案资源管理器中,如果还没有在设计器中打开 AuthorsService,请双击它。
在“视图”菜单上单击“代码”。
添加一个名为 GetAuthors 的方法以向客户端传递一个数据集。
如下所示,此方法创建一个新的 authors1 数据集,并根据 authors 表使用 SqlDataAdapter 对象填充该数据集。然后此方法返回数据集。

' Visual Basic
<WebMethod> Public Function GetAuthors() As authors1
Dim authors As New authors1()
SqlDataAdapter1.Fill(authors)
Return authors
End Function

// C#
[WebMethod]
public authors1 GetAuthors()
{
authors1 authors = new authors1();
sqlDataAdapter1.Fill(authors);
return authors;
}
添加名为 UpdateAuthors 的方法,以便将更改从客户端传递回数据库。
如下所示,此方法有一个 authors1 数据集参数 (authorChanges),该参数包含已更改的数据并通过 SqlDataAdapter.Update 方法更新数据库。Update 方法接受数据集中的更改。数据集返回给客户端。客户端然后用这个返回的数据集更新它自己的 authors1 数据集实例。有关 Update 方法和如何接受数据集更改的信息,请参阅数据适配器介绍。

' Visual Basic
<WebMethod> Public Function UpdateAuthors(ByVal authorChanges _
As authors1) As authors1
If Not (authorChanges Is Nothing) Then
SqlDataAdapter1.Update(authorChanges)
Return authorChanges
Else
Return Nothing
End If
End Function

// C#
[WebMethod]
public authors1 UpdateAuthors(authors1 authorChanges)
{
if (authorChanges != null)
{
sqlDataAdapter1.Update(authorChanges);
return authorChanges;
}
else
{
return null;
}
}
注意 在生产应用程序中,将向这些方法添加错误检查和异常处理。
从“文件”菜单中,选择“全部保存”。
从“生成”菜单中,选择“生成解决方案”。
在上一节中,您创建了一个中间层业务对象,该对象包含绑定到 SQL Server 数据库的数据集。您向中间层 AuthorsWebService XML Web services 中添加了代码,以便从数据源获取数据并用更改更新数据源。客户端通过 GetAuthors 和 UpdateAuthors XML Web services 方法访问这些函数。
导工 2003-01-16
  • 打赏
  • 举报
回复
是否分布式处理取决于你的部署,三层架构中中间层的对象是可以在不同机器上运行的,而不是非要在asp.net网页的机器上,其通讯方式可用 .net remoting 或 xml webservice 。当部署在不同机器上时,.net 对象应该做成com+组件,运行时有自己的进程。
至于实例的问题,我觉得这并不重要。完全的三层架构要求并不是完全面向对象的,因为它要求中间层是无状态对象,也就是说只是函数的集合,没有数据。既然无状态,一个实例和多个实例也就没有什么区别了。另外,用asp.net 可以实现只有一个中间层实例,但好象不推荐。
ZHANG9652 2003-01-16
  • 打赏
  • 举报
回复
这个问题是仁者见仁,智者见智,我认为只要能使系统产生最大效率,使系统有良好的可扩展性,又何必在理论上争个高低呢
blackcatiii 2003-01-16
  • 打赏
  • 举报
回复
Duwamish应该是定义很严格的多层结构。因为其每个层的作用非常清楚。数据库层负责读取和保存数据,返回的是从DataSet继承下来的对象,在中间层中进行数据验证和业务逻辑定义。再上面是由自定义控件和webform组成的表现层。
面向对象的设计和多层结构并没什么关系。
分布式处理和业务规则以及数据存取的封装好象也没什么关系。楼主认为不是真正的分布式处理,那请教:什么是真正的分布式处理?
cooldht 2003-01-16
  • 打赏
  • 举报
回复
能解决问题的就是可以的。
但要看什么最简单了。
我喜欢.net,web service

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧