基于组件的.NET软件开发(1)

基于组件的 .NET 软件开发

前言

随着软件技术的飞速进步,现代的大型软件都广泛采用了基于软件组件的开发方式。以成熟的 CBD ( Component Based Design :基于组件的系统设计)理论为指导,在对系统的分析与设计完成之后,系统开发体现为复用已有组件、开发新组件以及将所有组件装配起来的过程。 J2EE 大规模地使用各种组件构照复杂的企业信息系统,获得了巨大的成功。

作为后来者, .NET framework 汲取了 J2EE 的成功经验,在组件化开发方面有着自己独到的设计,在本文中,我们将介绍 .NET 组件化开发技术的最重要的两个范畴:混合语言开发与组件反射。笔者有充分的理由确信读者在了解了 .NET 的强大组件开发功能之后,一定会对 .NET framework 的设计和开发者敬佩不已,并会激起应用 .NET 来开发软件系统的强烈兴趣。

混合语言开发

Java 语言跨平台的设计,是 J2EE 在企业级系统中占据优势的重要原因,为了与 J2EE 竞争, .NET framework 在设计体系结构上采用了分层的设计模式,从而在理论上使跨平台成为了可能(事实上,已有真实可用的系统, MONO 就是运行在非 Windows 操作系统之上的 .NET framework ), .NET 设计师们还发现了 J2EE 的一个死穴—— J2EE 组件必须用 Java 语言开发!这种使用语言上的“独裁”无疑让喜爱其它语言的程序员们很不高兴。为此, .NET 在软件开发史上首次在设计软件运行平台时就考虑到了混合语言开发,在笔者看来,这真是一次影响深远的技术变革。

本文不打算全面介绍 .NET framework 中混合语言开发的内部机理,而只是从应用角度,通过几个短小却典型的实例,来看看我们如何在一个工程中集成多种语言开发的 .NET 组件。

组件的组合

当我们需要复用已有的组件的功能来开发新系统时,我们经常让新开发的组件简单地包容另一个已有的组件,以达到代码重用的功能,这种开发方式在面向对象设计理论中被称为“组合”。我们看看一个小例子:

我们要设计一个 C# 组件,其接口如图 1 所示:


图 1 C# 组件的 UML 图示

打开 VS.NET ,创建一个 C# 类库工程: CSharpComponent ,删除原有的 Class1, 往工程中添加一个新类 CSharpClass ,在其中增加一个函数 SaySomething ,代码如下:

public void SaySomething( string str)

{

MessageBox.Show(" 这是 C# 实现的功能,传入的字串是 :"+str);

}

然后,从菜单中选“生成” à “生成解决方案”,编译完成后会生成一个动态链接库: CSharpClass.dll 。

现在,我们已有了一个可复用的软件组件,虽然它的功能简直不值一提,但它的的确确是一个软件组件,在本质上与那些卖上几千美元的商业组件并无区别。

在这里我们需要明确: CSharpClass.dll 实际上可以称之为组件库,而类 CSharpClass 则可以看成是一个可以复用的组件。显然,一个组件库( DLL 文件)可以容纳多个组件(即完成某种功能的类)。

接着我们再创建一个 Windows 应用程序项目,但这时我们用的不再是 C# ,而是 VB.NET 了。我们给工程起名为: VBTestComponent ,从工具箱中把一个按钮拖到窗体上,我们打算在用户单击此按钮时,让它直接调用 C #组件 CSharpClass.dll 中的 SaySomething() 方法,并从 VB 中传送一个字串给此方法。

为了能使用开发好的 C# 组件,我们必须给 VB 工程添加对 CSharpClass.dll 的引用。在解决方案资源管理器窗口中的项目节点: VBTestComponent 上右击,从弹出菜单中选:“添加引用…”,将出现以下窗体:

图 2 添加对 C# 组件 CSharpClass.dll 的引用

单击“浏览…”按钮,找到 CSharpClass.dll ,确定后如图 2 所示。单击“确定”按钮关闭窗口,现在,我们就给 VB 工程增加了一个对 C# 组件的引用,可以在解决方案资源管理器窗口中很清楚地看到这点:


图 3 添加了对 C# 组件引用后的“解决方案管理器”

后面的事情就很简单了,在按钮的单击事件中书写以下代码:

Private Sub Button1_Click_1( …… ) Handles Button1.Click

Dim obj As CSharpClassNameSpace.CSharpClass

obj = New CSharpClassNameSpace.CSharpClass()

obj.SaySomething(" 我是从 VB 中调用 C #组件中的方法而出现的。 ")

End Sub

OK ,我们现在就实现了在 VB 中调用 C# 组件的功能,这简直太简单了吧!

聪明的你这时脑瓜一定在转了:既然从 VB 中可以这么容易地调 C# 组件,那么,反过来也一定行。或者,我可以做一个 VB 组件,然后,它又调用一个 C# 组件,而 C# 组件又可以调用某个 C++ 开发的组件,……,调来调去,浑然一体。当代愚公曰:“子子孙孙无穷尽也,何愁项目完不成?!”

现在再不用强迫所有程序员在一个项目中都用一种语言了,尽可以给每人分配一个独立的组件,让他们用自己喜欢的语言去开发,只要遵守事先定好的接口就行了。

笔者回想过去使用 VB 来调用 Win32 API 的惨状,不禁欢呼那种痛苦的日子一去不复返了!

Published At
Categories with Web编程
Tagged with
comments powered by Disqus