简介
WinFS 是能够进行多主机同步的存储平台,适合于在数以亿计的计算机上运行,具可访问性,并且支持国际用户。如果这还不够,那么 WinFS 还能够将文件数据、关系数据和 XML 数据联结在一起。您能够得到的要远远超过简单的“Hello World!”程序。
一种开始了解这一先进级别存储环境的方法是将软件体系结构解构,并探索其各个基本部分。存储系统的最基本部分之一是它的基础数据模型。数据模型是一个完整的系统,用于描述数据的表示方式和存储方式。
程序员主要通过使用 WinFS 类型系统来与 WinFS 数据模型进行交互,而不是直接与该数据模型进行交互。类型系统 — 尤其是与 .NET Common Type System (CTS) 类似的类型系统 — 在本质上是一个定义在创建、使用和管理类型运行库时所遵循规则的模型。好消息是 WinFS 数据模型和 WinFS 类型系统具有许多共同之处—实际上,它们有如此多的共同之处,以至于您可以安全地假定它们在很大程度上互为映像。
本探索在对 WinFS 平台进行编程时使用的类型系统。那些使用 .NET 编程的程序员已经熟悉了类型系统;毕竟,公共语言规范定义了 CTS。如果不使用任何类型,那么即使是使用 .NET 编写一个“Hello World!”程序也是不可能的。但是,即使是在简单的代码中,类型系统也是很重要的。撇开开发人员的世界不谈,类型系统对于那些使用开发人员通常不会使用的类型(如 Word 文档、PowerPoint 幻灯片和电子邮件)来了解其数据的用户而言,也是很重要的。WinFS 引入了一种类型系统,它使开发人员可以对更为复杂的数据进行建模,同时能够向最终用户隐藏相应的复杂性。
类型系统在软件中无处不在。像 C 和 Transact-SQL 这样的传统编程语言都具有类型系统;即使文件系统也具有类型系统。
软件中的类型系统有助于将它们本来致力于解决的问题域具体化。例如,因为 Visual Basic 和 C# 都包括 System.Decimal 类型,而该类型适合于财务值,所以您可以推断 Visual Basic 和 C# 可能适合于卓有成效地编写财务应用程序。对于 COBOL、Lisp 当然还有 T-SQL 也可以这么说。另一方面,本机 C++ 编程世界不包括货币类型。当然,您可以购买或开发适合于编写财务应用程序的类型。但您通常可以推断,对于编写财务应用程序而言,本机 C++ 不像 C# 或 Visual Basic 那样有效。关于 .NET 和 C++ 中货币类型的这两种评论当然都是有争议的,但通常被认为是常识。
像上述其他软件系统一样,WinFS 也具有类型系统。
使用 System.Storage.Meta 探索类型
您可以使用 System.Storage.Meta 命名空间中定义的类来探索 WinFS 类型系统。WinFS 中最重要的类型之一是 Item 类型。项表示 CTS 中的实体或根 System.Object 类型的非严格等价物。WinFS 系统具有四个层次:项、嵌套类型、关系以及作为您自己的类型的扩展。您可以使用 WinFS API 检索特定 WinFS 存储的所有为 Item 或为 Item 子类的类型。这很了不起;它有点类似于从既包含 bigint 类型的 id 又具有三个 varchar(55) 类型列的数据库中检索所有行。这一类型查询不同于更为常见的类型值查询,如从 id 等于特定值的数据库中检索所有行。下例中的查询可检索本地 WinFS 中定义的所有 Item 类型。值得庆幸的是,这非常简单:
| class EnumerateItemTypes { static void Main() { // List out Item types. EnumerateType(typeof( System.Storage.Meta.ItemTypeInfo)); Console.WriteLine("Press enter to end..."); Console.ReadLine(); } static void EnumerateType(System.Type metaType) { using (ItemContext context = ItemContext.Open()) { Console.WriteLine("List all {0} types", metaType.Name); ItemSearcher typeSearcher = context.GetSearcher(metaType); FindResult allTypes = typeSearcher.FindAll(new FindOptions( new SortOption("Name", SortOrder.Ascending))); foreach (System.Storage.Meta.TypeInfo tInfo in allTypes) { Console.WriteLine("name={0}",tInfo.Name); } } } } |

