在 .NET 中构建可重用组件






4.26/5 (20投票s)
2003年4月22日
5分钟阅读

107410
本文将介绍如何在 .NET 中构建可重用组件,以便在 Visual Studio .NET 等容器应用程序中用于 RAD(快速应用程序开发)。
引言
构建组件的主要优点之一是促进可重用性。例如,如果您构建了一个表示发票的对象,那么您公司中可能有许多其他项目可以重用同一个对象。在各种项目中重用组件的这一概念促进了所谓的 RAD(快速应用程序开发)。传统的应用程序开发环境,如 VB,通过提供一个工具箱,开发人员可以从中选择组件(例如,网格控件),来支持这种范式。
Visual Studio .NET 也支持这种范式,其中我们可以将开发的组件托管在工具栏中,然后将其拖放到各种项目中。开发环境将为我们编写必要的代码。
在本文中,我将介绍如何开发可插入 Visual Studio .NET 开发环境的组件。我们将开发一个简单的组件,它可以添加到工具栏中,然后通过属性对话框进行控制。
System.ComponentModel
System.ComponentModel
命名空间提供了用于实现组件和控件的运行时和设计时行为的类。此命名空间包括用于实现属性和类型转换器、绑定到数据源以及许可组件的基类和接口。
在命名空间中存在的各种类型中,我们对一种称为 Component
的类型感兴趣。下图显示了该类型的继承图。
在上图中,我们看到 Component
类型派生自 MarshalByRefObject
,因此只能通过将创建的对象的代理传递到 AppDomains 之间来实现远程处理。派生自 Component 的类必须存在于创建它们的 AppDomain
中,但可能通过引用跨 AppDomain
边界被客户端引用。通常,派生自 Component 的可重用类(如控件)的实例将存在于单个 AppDomain
中。
此外,如图所示,Component
类实现了 IComponent
和 IDisposable
接口。IDisposable
是一个接口,它允许类通过显式的 Dispose
方法来实现确定性最终化,而不是完全依赖于 CLR 的垃圾回收算法。IComponent 通过添加 Disposed 事件和支持与组件的站点交互来简单地扩展此接口。通过这种方式,实现了 IComponent
接口的类可以被拖放到 VS.NET Web Forms 设计器表面,以支持快速应用程序开发。
站点,顾名思义,是指组件在容器中的放置位置。例如,Web Forms 设计器是一个实现 System.ComponentModel.IContainer
接口的容器。当组件放置在容器中时,会创建一个站点,并且可以使用 ISite
接口的 Component
属性来引用该站点。对于通常在业务应用程序中完成的开发类型,您无需担心创建容器和处理站点。
一个简单示例
基于上述基础知识,让我们构建一个简单的示例。在这里,我们将考虑一个名为 Contacts 的可重用类,用于维护各种类型的联系人(如组织、个人等)。启动 Visual Studio .NET,创建一个类库项目,并在其中键入以下代码。
Imports System.ComponentModel
<DefaultProperty("ContactName")> _
Public Class GenericContact : Inherits Component
' Properties that are generic to all contacts
Private mstrContactName As String
Private mstrContactType As String
' Public property that exposes the contact name
<Browsable(True), Category("Properties"), _
Description("Identifies the contact name.")> _
Public Property ContactName() As String
Get
Return (mstrContactName)
End Get
Set(ByVal Value As String)
mstrContactName = Value
End Set
End Property
' Public property that exposes the contact type
<Browsable(True), Category("Properties"), Description( _
"Identifies the contact type.")> _
Public Property ContactType() As String
Get
Return (mstrContactType)
End Get
Set(ByVal Value As String)
mstrContactType = Value
End Set
End Property
' Default constructor for the contact
Public Sub New()
Me.ContactName = "MSDN India"
Me.ContactType = "Web Site"
End Sub
' Constructor that accepts parameters for the contact
Public Sub New(ByVal pContactName As String, _
ByVal pContactType As String)
mstrContactName = pContactName
mstrContactType = pContactType
End Sub
End Class
如果您查看上面的代码,它是一个非常简单的类,与您通常为解决业务领域问题而开发的类非常相似。不同之处在于继承自 IComponent
以及修饰类定义和方法的各种属性。以下几点说明了代码中使用的各种属性及其含义。
Browsable
。此属性确保属性显示在属性窗口中。Category
。此属性用于按功能对属性进行分组。Description
。此属性用于为属性附加描述。DefaultProperty
。此属性用于指示在属性窗口中显示时将作为默认值的属性名称。
请注意,在上面的示例中,我们使用了公开类各种属性的属性,并且我们在这些属性上应用了属性。
将此代码放在编辑器中后,使用“生成”菜单进行编译。这将生成一个程序集,然后我们可以在 VS.NET IDE 中引用它。要在 IDE 中添加此组件,请执行以下步骤(例如,在 Windows 窗体项目上)
- 在 Visual Studio .NET 工具箱中,选择“常规”选项卡,右键单击并选择“添加/删除项”(我使用的是 Everett Final Beta,在早期版本的 VS.NET 中,此选项可能称为“自定义工具箱”)。
- 选择 “.NET Framework 组件”选项卡,然后单击“[浏览]”按钮以查找您在上面示例中创建的程序集。
- 找到程序集后,将其选中。程序集将出现在“.NET Framework 组件”列表中并被选中。
- 单击“[确定]”按钮。
- “常规”工具箱然后显示该组件。
您现在可以将此组件拖放到任何其他项目的设计器表面,VS.NET IDE 将自动编写必要的初始化代码(可以通过选择“查看代码”选项然后打开自动生成的区域来查看)。此外,您可以使用“属性”窗口来设置对象中定义的各种属性的值。以下图像显示了上述步骤
您可以看到属性窗口显示了我们在代码中定义的公共属性。此外,ContactName
被显示为默认属性。可以更改这些属性,并且会自动更改自动生成的代码。
结论
在本文中,我们学习了如何编写可重用的组件,这些组件可以插入 VS.NET 接口以确保 RAD 开发。您可以使用这些功能来开发企业组件,并将它们分发给所有开发团队,以便您可以确保基于标准的开发。此外,业务对象可以以一致的方式用于所有类型的项目。