发布的早期准备
许多项目陷入麻烦的原因是因为对发布阶段的计划失败了,包括版本、安全、和如何包装和发布你的程序。你能避免陷入麻烦的办法是看.NET Framework SDK文档中与发布集合相关的版本和安全的部分,然后使用发布项目帮助把你的产品整合起来。
你可以在集合层设置影响你的.NET集合中的版本和安全方面的几个特性,当你在Visual Studio .NET中用项目向导建立一个项目时,向导根据语言增加AssemblyInfo.cs或者AssemblyInfo.vb到你的项目中。这个文件中是你想用来把适当的元数据放到你的集合的特性。如果你不想的话你就不必使用这些文件;你不需要定义这些文件中的每个特性;你可以把你想要的特性放在你的集合项目的任何代码文件中。当你标记这些应用到集合中的特性时,用特性标签里的“assembly:”前缀,你不需要在项目里的另一个模块中声明他们,你可以把他们放在任何你想放的地方。
你将想要设置一些特性来表示你的集合,包括名字、公司、描述、产品、版权和商标特性。而且,其它特性,AssemblyVersion、AssemblyKeyFile和 AssemblyKeyName特性,在运行时直接影响你的程序。
AssemblyVersion特性允许你建立主要的版本、次要的版本、修订版本、和版本号。运行时使用这些项目来区分集合。这就允许相同集合的不同版本一起运行在公用集合缓存区(GAC)。如果在应用程序的本地目录运行集合,集合的版本和关键特性将不会起作用。但是如果你想支持集合的多个版本,或者使他们可以被其它程序访问,或者被分布在不同目录上的程序访问,你需要使用gacutil.exe工具把你的集合放到GAC。为了避免冲突和确保行为一致,正确的版本编制是非常重要的。
AssemblyKeyFile 和 AssemblyKeyName特性让你指定基于加密的公共键来安排你的集合数位。你可以给你的集合赋一个强大的名字,这就意味着你不需要依赖信任关系来校验签名的来源。或者你可以给你的集合申请一个证明,用一个可信赖的来源加以校验,来确认签名的真实性。
在设计.NET程序之前你需要计划所有的这些因素,特别是如果你的程序和其它应用程序交互或者给其它应用程序提供服务。如果你正确使用了这些性能,.NET版本和安全机制让你用比Windows DLLs 或者 COM对象更丰富的方法来发布、维护和更新你的应用程序。
你也可以使用VS.NET IDE中一般项目向导为你的应用程序和服务创建发布项目(见javascript:openWindowRes('http://www.fawcette.com/china/DotNetMagazine/2001_12/GetReadyToDeploy/Figure1.asp');">图1)。几个不同的发布项目类型提供了建立选项的公共组合,这些选项你可以通过向导配置。一旦向导建立了项目,你可以通过修改项目属性或者增加文件和安装步骤来进一步定制安装过程。你不需要象版本和安全方面一样担心项目发布,但是你至少调查现有的能力,考虑如何使用他们包装和发布你的项目。
不同语言程序员的交互,管理语言信息量
.NET重要的市场方面之一是跨语言开发和调试支持。这种能力给你更多的机会来展现你在建立新类型的项目时的才智。例如,ASP网络开发者有一个特定的方法来写他们的代码,使用某个类库或者COM对象,这些代码通常不同于C++和VB COM组件开发者的代码。使用ASP.NET,网络程序员可以使用不同的语言做底层开发,并且能使用在非网络程序中使用的编程方法做网络开发。目前的网络开发者可以在ASP.NET中使用面向对象编程,也可以使用在组件开发中使用的框架类库。这也使得开发其它类型的应用也变得容易了。
然而,在大多数公司,跨语言开发的优势是受限制的。一想到每个代码模块都是用不同的语言开发的,配置管理人员就会在深夜吓出一身冷汗。你仍然需要在哪种类型的模块应该用哪种语言方面保持连贯。你需要维持这种连贯性至少在应用程序子系统的范围内。但是,每个政策可能是你偏离的起点,所以在开发中选择不同语言的分类能力,是在.NET的世界里最重要的。
从执行中分离出接口
面向对象和基于组件开发的关键方针就是争取接口部分和执行部分相分离。不管是使用C#,VB.NET,或者C++,你都可以在.NET的代码层很容易的实现它。你用被选语言的适当关键字将接口定义为一个独立的实体,比如说用C#中的接口关键字,然后用一个类实现接口。另外,你也需要考虑在不同的发布情况下,如何管理不同版本的接口。
如果你在包含组件的主类的集合中定义了接口。你就没有办法从组件版本(即实现)中分离出接口的版本。但是如果你在从这些接口的实现类分离出来的集合里,定义一个接口。这样,你就可以使用.NET中的集合版本能力,以使你能够得到特别接口上的正确版本,而不必担心实现接口的组件的版本。
已经发布的接口应该是不可变的,所以把它放在一个独立的集合中,这样你使用版本号就可以清晰的显示接口是否改变。客户端能够确认它使用接口的特别版本,而不必担心实现接口的组件的版本。一旦你建立了一个定义良好的接口,你很少需要为这个接口定义一个新的版本。改变底层执行部分是很平常的。采用这种分离集合的方法,使你自己可以得到更多的控制权,和让你使用.NET的版本特征以帮你加强接口的版本整合。
使用值类型
在.NET,所有的东西是一个对象,都是来源于一个公共基类。这就变得相当灵活,给你许多好处,比如运行时类型检查和类型转换。但是.NET也能够让对象不会出现上述这些性能。这就是为什么有值类型。如果你有一个类,它放置基本类型的信息,你应该考虑在C#中把它声明为struct,或者在VB.NET中把它声明成structure。他们是值类型,和参考类型正好相对。他们仍然是对象,但是.NET运行时存储值类型是在stack而不是heap,他们不会由于参考指针而浪费更多的内存。如果你正在管理简单对象的大集合,或者需要一个远程操作的轻量级版本,一定要考虑值类型。