Component-based Design and Programming
基于组件编程有很多的优势:代码重用,团队支持,多语言开发和独立更新。在1990年,COM是微软流行的基于组件开发的模型。.NET替代了COM,提供了一个全新模型:语言独立的、注册自由、版本明确……
建立组件
什么是组件?组件==编译后的实体。组件在.NET中就是Assembly(exe/dll)。
组件与物理打包相关,多层应用程序是一个很好的表现组件的例子。
在VS.NET中创建ClassLibrary就可以创建组件。按照标准的设计和编码过程,使用名称空间进行逻辑组织,使用类和OO的设计。
可使用internal关键字限制只能被组件内部的类访问,在组件外部没有权限访问。
版本号:major.minor.build.revision
AssemblyInfo.cs中的属性可以控件。在编译时被放置到Assembly中,默认情况下版本号在每次build时都会被改变。版本号中的“*”可以每次被变化,否则会固定。
谁来控制版本:开发者来决定何时改变版本号(任何时候),但需要保证在不同版本中的兼容性(如果需要)
默认情况下,.NET&CLR会忽略版本号。如果.EXE需要.DLL,那么任何版本的.DLL都可以。如果组件有“强命名/强名称(strong name),那么如果EXE提及需要1.0.3.12版本的DLL,那么它必须查找到1.0.3.12版本的DLL。
Assembly在.NET的命名有四部分:
1)friendly,human readable name
2)culture
3)version#
4)public key token
Assembly如果有公钥token,那么它就有强命名,这表示它被私钥数字签名过。
强命名的好处:安全性,组件无法篡改!组件的多个版本可以共存。应用程序可以使用它建立时的组件版本,而不是第一个找到的DLL。
强命名,通过属性来设置除Friendly name之外的属性。如:
[assembly:AssebmlyCulture("")]
[assembly:AssemblyVersion("1.0.0.0")]//如果最后一位想自动变换可写成“*”
[assembly:AssemblyKey("..//..//pubpriv.key")]
强命名生成步骤:
1)生成一组public-private key pair。
2)将其通过AssemblyInfo.cs属性应用到组件中。
3)重新编译assembly
4)重新编译客户端
如何建立Public/Private Key文件?
使用.NET“SN”命令行用法,-K选项生成key pair。将该文件旋转在VS Solution/project目录下即可。如:
SN.exe -k pubpriv.key
如何保护Key文件?
私钥key的安全,必须保证该文件是秘密的。并不是每个程序员都需要一份key文件的拷贝,因为.NET支持延迟签名。在发布之前,部署团队可以签署assembly。
[assembly:AssemblyDelaySign(true)]
部署组件
前提:.NET必须安装在目标计算机中,应用程序必须安装在目标计算机中,应用程序必须在运行时可以定位组件。
如果不使用强命名,先去找AppBase,否则找sub-dir with same name。否则再去找private path。在配置文件中配置其路径。
如果使用强命名,先去找GAC,再去找CodeBase directory等。
部署时可使用Xcopy或Zero-touch。
版本转向:
应用程序的config文件将覆盖EXE的manifest。例如EXE引用1.0.0.0的BT,我们要求EXE使用2.0.0.0。则如下:
<configruation>
<runtime>
<assemblyBinding xmlns="...">
<dependentAssembly>
<assemblyIdentity name="BusinessComponent" publicKeyToken = "1234ASDF"/>
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
</runtime>
</configuration>
.NET 1.0环境下开发的程序基本可运行于.NET2.0,不需要版本转向。
如何将组件放到GAC中?
1)组件必须是强命名的。
2)使用.NET“gacutil”命令行工具。>gacutil /i BusinessComponent.dll即可安装
这样可以共享DLLs,并行安装不同版本,获得更快的下载时间。
CodeBase可以转向到不同的目录和机器,保存用户的internet下载缓存。对每个版本只有一个codebase。
配置组件
允许覆写一些.NET默认的行为。应用程序提供配置信息的机制。例如数据库连接字符串。
缺点(潜在的冲突)
1)machine-wide config
2)用户自己的config file
3)应用程序配置
4)组件配置