应用程序 /Bin 目录
导入业务对象 配置概述一节。通过使用配置还可将附加的程序集导入应用程序。例如:
使用 Web 应用程序组件的 COM 模型时遇到的问题是,这些组件必须注册(通常是使用 regsvr32 工具)后才能在传统的 ASP 应用程序中使用。对这些类型的应用程序进行远程管理通常是不可能的,因为注册工具必须在服务器上以本地方式运行。更为棘手的是,这些组件经应用程序加载后便在磁盘上保持锁定状态,必须使整个 Web 服务器停止运行后才能替换或移除这些组件。
为尝试解决这些问题,ASP.NET 允许将组件放置在已知目录中并在运行时自动找到它们。该已知目录总是命名为 /bin,并紧位于应用程序根目录(一个由 Internet Information 服务 (IIS) 定义的虚拟目录)下。这样做的好处是组件无需注册便可在 ASP.NET 框架应用程序中使用——只需将组件复制到 /bin 目录或执行 FTP 文件传输便可部署组件。
除提供零注册方法部署复杂组件外,ASP.NET 不要求这些组件在运行时在磁盘上保持锁定状态。ASP.NET 在后台复制 /bin 中的程序集并加载这些 shadow 副本。原始组件即使在 Web 服务器仍在运行时也可以替换,而对 /bin 目录的更改则由运行时自动获取。当检测到更改时,ASP.NET 允许完成当前执行的请求,并将所有新传入的请求定向到使用新组件的应用程序。
从最基本的层面看,业务组件只是一个类,可以从导入它的 Web 窗体页为其创建实例。下面的示例定义一个简单的 HelloWorld 类。该类有一个公共构造函数(当初次创建该类的实例时执行此构造函数)、一个称为 FirstName 的 String 属性和一个通过 FirstName 属性值打印问候语的 SayHello 方法。
Imports System
Imports System.Text
Namespace HelloWorld
Public Class HelloObj
Private _name As String
Public Sub New
MyBase.New()
_name = Nothing
End Sub
Public Property FirstName As String
Get
Return(_name)
End get
Set
_name = value
End Set
End Property
Public Function SayHello() As String
Dim sb As New StringBuilder("Hello ")
If (_name <> Nothing) Then
sb.Append(_name)
Else
sb.Append("World")
End If
sb.Append("!")
Return(sb.ToString())
End Function
End Class
End Namespace
|
|||
| C# | VB | JScript | |
若要编译该类,应从命令行运行 C# 编译器 (Csc.exe)。/t 选项通知编译器生成库 (DLL),/out 选项通知编译器将结果程序集放置到的位置。本例中,应用程序的 /bin 目录紧位于本教程的“aspplus”虚拟根目录下,并假设该命令从示例目录,即 ...\QuickStart\AspPlus\Samples\WebForms\Busobjs 运行。
csc /t:library /out:..\..\..\..\bin\HelloObj.dll HelloObj.cs
对于 Visual Basic,等效编译命令是:
vbc /t:library /out:..\..\..\..\bin\HelloObjVB.dll HelloObj.vb
对于 JScript,等效编译命令是:
jsc /out:..\..\..\..\bin\HelloObjJS.dll HelloObj.js
该组件现在可供应用程序中任何需要使用它的 Web 窗体页使用。下面的 HelloObj.aspx 示例阐释了此功能。

VB HelloObj.aspx
[运行示例] | [查看源代码]
注意位于页面顶部的 Import 指令,它指定要包含的命名空间。使用该指令包含命名空间后,便可从 Web 窗体页内部使用该类。由于程序集由 ASP.NET 运行时预加载,因此只需简单的命名空间导入便可使组件可用。以下代码是 Import 指令的示例。
<%@ Import Namespace="HelloWorld" %>
默认情况下,ASP.NET 在应用程序启动时从 /bin 目录加载所有程序集。要加载的程序集通过配置系统指定。有关详细信息,请参阅
<configuration>
<compilation>
<assemblies>
<!--The following assemblies are loaded explicitly from the global cache-->
<add assembly="System.Data"/>
<add assembly="System.Web.Services"/>
<add assembly="System.Drawing"/>
<!--This tells ASP.NET to load all assemblies from /bin-->
<add assembly="*"/>
</assemblies>
</compilation>
</configuration>
外部组件的典型用途是执行数据访问。它简化了页中的代码,增强了可读性并将用户界面 (UI) 逻辑与系统功能分开。下面的实例阐释了简单的两层 Web 窗体页,它使用数据访问组件检索产品信息。

VB TwoTier.aspx
[运行示例] | [查看源代码]
数据访问组件采用其构造函数的单个参数来指定产品数据库的连接字符串。Web 窗体页调用该组件的 GetCategories 方法填充下拉列表,调用该组件的 GetProductsForCategory 方法显示用户所选类别的产品。
三层应用程序模型扩展了两层方案,在 UI 和数据访问逻辑之间包含了业务规则。此模型允许 UI 开发人员处理更高抽象化的级别,而不是通过低级数据访问组件 API 直接操作数据。中间业务组件通常强制业务规则并确保遵守数据库的关系和主键约束。下面的示例使用中间组件基于客户端输入的两位供应商 ID 计算折扣。

VB ThreeTier.aspx
[运行示例] | [查看源代码]