详细描述
现在参考附图描述所要求保护的主题,在全部附图中,相同的参考标号用于指代相同的要素。在以下描述中,出于解释的目的,阐明了众多具体细节以提供对所要求保护的主题的全面理解。然而,很明显,该主题可以在没有这些具体细节的情况下实施。在其它实例中,以框图形式示出了公知的结构和设备以便于描述本发明。
如本申请中所使用的,术语“组件”和“系统”指的是计算机相关的实体,无论是硬件、硬件和软件的组合、软件还是执行中的软件。例如,组件可以是,但不限于,运行在处理器上的进程、处理器、对象、可执行码、执行的线程、程序和/或计算机。作为说明,运行在服务器上的应用程序和服务器都可以是组件。一个或多个组件可驻留在进程和/或执行的线程中,并且组件可位于一个计算机上和/或分布在两个或多个计算机之间。此处使用词语“示例性”来意指用作示例、实例或说明。此处被描述为“示例性”的任何方面或设计不一定要被解释为相对于其它方面或设计是优选或有利的。
此外,所要求保护的主题的各方面可使用标准编程和/或工程技术而被实现的方法、装置或制品,这些技术产生控制计算机实现本发明的各方面的软件、固件、硬件或其任何组合。此处所使用的术语“制品”旨在包含可从任何计算机可读设备、载体或介质访问的计算机程序。例如,计算机可读介质可包括但不限于磁存储设备(例如,硬盘、软盘、磁带……)、光盘(例如,紧致盘(CD)、数字多功能盘(DVD)……)、智能卡、以及闪存设备(例如,卡、棒、钥匙驱动器……)。另外,应当理解,可采用载波来承载诸如在发送和接收电子邮件或访问如因特网或局域网(LAN)等网络时使用的计算机可读电子数据。当然,本领域的技术人员将认识到,可对这一配置作出许多修改而不背离此处所描述的范围或精神。
现在将参考附图来描述所要求保护的主题,在全部附图中相同的参考标号表示相同的要素。现在参考图1,示出了一可扩展对象合成系统100。对象的合成在概念上涉及至少部分地基于与一目标对象相关联的上下文来作用于该目标对象。上下文可被定义为特定应用程序中现有的实体以及这些实体之间的关系,而目标对象可被定义为在这一上下文中合成的对象。如此处所使用的合成可包括创建对象(例如,目标对象)并生成关于该对象的关系、接收现有对象(目标对象)并创建现有对象和其它对象之间的关系、删除与目标对象相关联的现有关系、更改与目标对象相关联的关系等等。关于一目标对象的合成可通过利用一个或多个定制的合成策略来进行,其中与实现该合成策略相关联的框架允许添加新的合成策略以及定义对这些策略的使用。
更具体而言,系统100包括接收定制合成策略的接收组件102,其中合成策略可从用户、程序、存储器、硬盘或任何其它适当的位置接收。定制合成策略可以是由接收组件102接收的几个策略之一,并且可包括可用于合成对象的任何适当的动作。例如,定制合成策略可涉及通过调用适当的对象初始化程序来创建存储器中的新对象实例、在一特定上下文中建立一对象与其它新的或现有的对象之间的关系、调用一对象上的方法、作用于一上下文内的其它对象而不作用于目标对象本身等等。可以理解,可以与定制合成策略相关联的这一动作列表本质上是示例性而非限制性的。所接收的合成策略可负责一特定样式的合成,并且可依赖于其它相关联的合成策略以在定制合成策略之前、在定制合成策略之后、和/或在定制合成策略期间运行,以便允许所接收的定制合成策略的正确运行。由此,合成策略的行为可仅由实现来确定,并且能够(但不必需是)允许外部实体通过政策来临时或永久地更改其行为。这些政策可通过程序性的、声明性的或基于配置的手段来提供。
定制合成策略可从接收组件102传送到实现组件104,其中实现组件104利用该合成策略来合成对象106。例如,实现组件104可由应用程序在运行时调用,并且应用程序可请求特定的定制合成策略以及指定与其相关联的默认政策。接收组件102之后可接收这一合成策略。然后可查明上下文(如上所述)并将其提供给实现组件104,其中上下文包括应用程序中的一组实体-例如,现有的对象实例、政策和类型定义、应用程序配置等。至少部分地基于上下文和应用程序调用,实现组件100可合成对象106。因此,可以查明系统100允许关于合成的可扩展性,用于实现合成的合成策略可被独立地构建和使用而不需要对消费应用程序或其它合成策略的更改。换言之,在一特定上下文中存在几个规则,并且利用这些规则可用一个调用来创建对象并将它们连线在一起,其中规则是可扩展的且是政策驱动的。对系统100的一种模拟是工厂线,其中系统100允许以用户的意愿来向该工厂线提供额外部分。这些部分(策略)然后可由应用程序在运行时消费和使用,其中与该应用程序相关联的上下文可确定要采用哪些合成策略、采用哪些政策、合成策略的排序等等。
在示出了系统100的好处的又一具体示例中,可能期望以基本上相似的方式将与一应用程序相关联的几个对象连线(wire-up)在一起,其中这一连线理想地是定制的。与静态系统相反,系统100允许在不更改应用程序或更改其它合成策略的情况下创建一个或多个定制合成策略并实现这些合成策略。更详细而言,个人可能希望连线对于与一应用程序相关联的几个对象是完整的。在常规的系统中,如果未对系统提供合成策略,则需要手动对每一对象完成连线。然而,系统100允许提供执行期望连线并自动对适当对象(可由上下文确定)执行连线的定制策略。例如,适当的定制策略可由程序员创建、在应用程序运行时提供给接收组件102、然后由实现组件104基于上下文来实现。
现在转向图2,示出了帮助借助通过可扩展框架提供的合成策略来进行对象合成的系统200。系统200包括接收多个定制合成策略的接收组件102,其中这些合成策略涉及至少合成目标对象106。如上所述,合成可涉及各种具体动作,包括创建存储器中的对象实例、建立对象之间的关系、修改内部对象状态、作用于一上下文中的各种对象等等。接收组件102可以与定义并实现关于多个定制合成策略中的每一个的政策的政策组件202相关联。例如,政策可以是永久的或临时的。永久政策在多次合成执行之间保持恒定,而临时政策仅对系统200的单次执行存在。政策组件202允许应用程序指定需要哪些合成策略以及指定默认政策。另外,政策组件202可至少部分地基于程序性的、声明性的或基于配置的命令来定义关于定制合成策略的政策。此外,临时政策可用于覆盖或扩展特别地与定制合成策略相关联的政策。此外,政策组件202可在涉及目标对象106的调用之间更改与策略相关联的政策。这一灵活性在常规系统中是无法达到的。
接收组件102还可与描述实现多个定制合成策略的次序的排序组件204相关联。此外,排序组件204可以与向排序组件204提供涉及对象106的上下文的上下文组件206相关联。如上所述,上下文可包括包含目标对象106的应用程序中的实体,诸如现有的对象实体、政策和类型定义、应用程序配置等。此外,现有的对象实例可以是本地或远程的,其中术语“远程”指的是另一计算机、网络、进程等中的对象。上下文组件206可确定上下文,并将其提供给排序组件204,后者利用该上下文来确定应用合成策略(以实现目标对象106的合成)的次序。排序组件204还可接收涉及次序的声明性或程序性语句。此外,排序组件204可使得合成策略在需要时并行地操作。
所确定的上下文以及合成策略的次序然后可被提供给实现组件104,后者使得这些策略在应用程序运行时以特定次序执行。因此,可以确定通过该图中所描述的组件实现了一种灵活且健壮的对象合成系统。
现在参考图3,示出了利用上述一个或多个方面来合成目标对象106的示例性系统300。系统300包括接收一个或多个定制合成策略的接收组件102。在示例性系统300中,由接收组件102接收的合成策略可涉及构建目标对象106。接收组件102与可实现关于目标对象106所接收的策略的实现组件106相关联。实现组件104可包括对象构建器组件302和/或与对象构建器组件302相关联,该组件可接收来自程序员的代码304和类定义306。给定代码304和定义306,目标对象106可由对象构建组件302根据所接收到的策略来构建。对合成策略的这种使用允许面向对象的程序员以与常规框架相比更高效的方式来完成高度复杂和困难的任务。
系统300还可包括可接收并询问用户定义的政策的政策询问器组件308。例如,政策可指定该策略是被采用单次还是对几个实例采用。实现组件104还可确定和/或接收与目标对象106相关联的上下文,其中上下文涉及应用程序中的一组实体,诸如现有的对象实例、政策和类型定义、应用程序配置等。系统300通过将实际合成工作委托给一个或多个合成策略来允许多个合成样式和要求。例如,每一策略可负责一特定样式的合成。所接收的策略可允许外部实体借助政策来更改其行为,其中政策可由程序性的、声明性的或基于配置的手段来提供。政策询问器组件308可询问这些政策以确定它是否为永久政策和/或临时政策。永久政策在多次合成执行之间保持恒定,而临时政策对构建器的单次执行存在。临时政策可覆盖或扩展提供给合成策略的政策。
由系统300实现的合成策略可被扩展,其中扩展可独立地构建和采用。此外,扩展可以是独立或相互依赖的。在系统300的一种具体的示例性使用中,工厂、构建器和责任链的模式都是公知的,并且已被应用于解决如在现有的依赖性注入容器和代理工厂中所示的合成问题。系统300以合成进行的方式来允许可扩展性,因为实现合成的策略可在不需要对消费应用程序或其它策略的更改的情况下独立构建和使用。
在一具体示例中,系统300可支持.NET事件,由此允许类作者用指定一事件的主题(topic)的发布者(publisher)属性来修饰该事件。另一类作者可用指定同一主题的订阅者(subscriber)属性来修饰事件。在运行时,此处所描述的框架可用于创建并连线这些类的实例而不需要来自调用代码的任何干预。换言之,对象构建器组件302可创建并联系类的实例。例如:
public class PublisherClass
{
[EventPublisher(“MyTopic”)]
public event EventHandler MyTopicEvent;
//做激发该事件的某些事情…
}
public class SubscriberClass
{
[EventSubscriber(“MyTopic”)]
public void HandleMyTopicEvent(object sender,EventArgs e)
{
//对该事件做某些事情
}
}
以上示出了可由系统300用于在创建对象时执行事件到处理程序的连线的示例性策略。
在另一示例中,定义306可包括以下C#类定义:
public class ParentClass
{
private ChildClass child;
public ParentClass(ChildClass child)
{
this.child=child;
}
public ChildClass Child
{
get{return child;}
}
}
public class ChildClass
{
}
所接收的策略可用于提供允许以下示例性代码304生成自动用ChildClass(子类)的实例填充的ParentClass(父类)的新实例的类。
更详细而言,以下测试用例示出了利用称为ObjectBuilderContainer(对象构建器容器)的类来生成上述新实例,其中该类提供了可用提供简单的基于构造函数的依赖性注入的一组策略来填充的所要求保护的主题的实现。
[测试]
public void ConstructorDependencyInjectionTest()
{
ObjectBuilder builder=new ObjectBuilder();
ParentClass parent=builder.Build<ParentClass>();
Assert.IsNotNull(parent.Child);
}
扩展该示例,这一代码(构建代码)可通过添加使用反射(reflection)来定位有属性的方法并执行这一方法的附加策略来扩展。
public class SomeClass
{
public bool MethodInvoked=false;
[InvokeMethod]
public void DoSomething()
{
MethodInvoked=true;
}
}
[测试]
public void MethodInvocationStrategyTest()
{
ObjectBuilder builder=new ObjectBuilder();
builder.AddStrategy(new MethodInvocationStrategy());
SomeClass result=builder.Build<SomeClass>();
Assert.IsTrue(result.MethodInvoked);
}
可以查明构建器的行为通过在使用该构建器之前向其添加一策略而被迅速且容易地修改。
从以上示例中,可以确定系统300可实现执行诸如构造函数依赖性注入(constructor dependency injection)、设置函数注入(setter injection)、容器中的注册和存储、从容器中查找、类型映射、属性反射、代理返回以及其它适当任务等任务的策略。除了以上示出的简单策略之外,某些策略可采用要配置的政策。例如,特定实例中的用户可使用政策来配置某些策略。例如,用户可能希望对特定特性执行设置函数注入。在这一情况下,用户可能提供指示应如何由实现组件104来实现策略的政策(由政策询问器组件308分析)。例如:
public class Person
{
private string name;
public string Name
{
get{return name;}
set{name=value;}
}
}
[测试]
public void PropertyPolicyTest
{
ObjectBuilder builder=new ObjectBuilder();
builder.AddStrategy(new PropertySetterStrategy());
builder.AddPolicy(new PropertyPolicy(“Name”,“John Doe”));
Person result=builder.Build<Person>();
Assert.AreEqual(“John Doe”,result.Name);
该政策是永久政策,这表现在对构建器的每次运行,具有名为“Name”(名字)的串特性的类将被设为“John Doe”。然而,可以理解,系统300(以及此处所描述的其它系统)可支持用于构建器的单次运行的政策。例如:
[测试]
public void TransientPolicyTest
{
ObjectBuilder builder=new ObjectBuilder();
Builder.AddStrategy(new PropertySetterStrategy());
PropertyPolicy johnPolicy=new PropertyPolicy(“Name”,“John Doe”);
Person john=builder.Build<person>(johnPolicy);
PropertyPolicy samPolicy=new PropertyPolicy(“Name”,“Sam Smith”);
Person sam=builder.Build<Person>(samPolicy);
Assert.AreEqual(“John Doe”,john.Name);
Assert.AreEqual(“Sam Smith”,sam.Name);
}
现在转向图4,示出了帮助合并并封装出现在面向对象的程序设计中的公共模式的系统400。系统400包括接收策略的接收组件102和在应用程序运行时实现该策略的实现组件104。在系统400的一种使用中,策略可涉及构造函数依赖性注入,这与在运行时发现类构造函数的要求、解析这些要求以确定需要检索或创建的对象、以及在创建对象本身时将其传递到用于对象的构造函数中。面向对象的程序设计中的构造函数是用于创建对象的新实例的一些方法,并可需要某些参数。构造函数依赖性注入是构造函数所需的方法可以经推理以使使用该类的开发者无需显式定义这些方法的理念。因此,当基于所推理的参数列表创建对象时,要求被注入到构造函数方法调用中,其中与实现组件104相关联的机器学习组件402可生成推理。
如此处所使用的,术语“推理”一般指从一组通过事件和/或数据捕捉的观察中推出或推断系统、环境和/或用户的状态的过程。例如,推理可用于标识特定的上下文或动作,或可生成状态的概率分布。推理可以是概率性的-即,基于数据和事件的考虑计算感兴趣的状态的概率分布。推理也可以指用于从一组事件和/或数据组成更高级事件的技术。这类推理导致从一组观察的事件和/或储存的事件数据构造新的事件或动作,无论事件是否在相邻的时间上相关,也无论事件是来自一个还是若干个事件和数据源。可使用各种分类方案和/或系统(例如,支持矢量机、神经网络、专家系统、贝叶斯信任网络、模糊逻辑、数据融合引擎…)来执行自动化和/或推理的动作。
在一个具体示例中,推理可通过策略和政策来控制。由此,推理可通过分析可应用于构造函数的参数的属性声明来实现。在另一示例中,推理可由机器学习组件402通过对对象类型的简单检查(在分析上下文时)来进行。再者,元数据可被提供给策略(可被认为是对策略的建议),从而允许机器学习组件402作出关于这一确定的更好决策。元数据例如可用外部文件404(例如,外部XML配置文件)的形式来提供。在另一示例中,元数据可以采用由程序员在代码中给出的建议的形式。在又一示例中,元数据可从诸如.NET等属性语言来获得。由此,构想了用于接收和/或提供元数据的任意合适的方式,并且这些方式旨在落入此处所附权利要求书的范围之内。此外,尽管系统400是参考构造函数依赖性注入来描述的,但是可以理解,推理可对于连线、设置函数注入、容器中的注册和存储、从容器中查找、类型映射、属性反射、返回代理对象等来进行。
现在参考图5-13,将借助一系列动作来描述根据所要求保护的主题的方法。可以理解和明白,所要求保护的主题不受动作次序的限制,因为某些动作可以按不同次序和/或与此处示出并描述的其它动作同时发生。例如,本领域的技术人员将理解和明白,方法可被替换地表示为诸如状态图中的一系列相互关连的状态或事件。此外,并非所有示出的动作都是实现根据所要求保护的主题的方法所必需的。另外,还应当理解,以下并贯穿本说明书所公开的方法能够被储存在制品上以便于将这些运输和传送到计算机。如此处所使用的术语制品旨在包含可从任何计算机可读设备、载体或介质访问的计算机程序。
具体地参考图5,示出了用于合成符合面向对象的程序设计的一个或多个对象的方法500。方法500在502处开始,并在504处接收多个合成策略。这些策略可由用户定制,并且可以依赖于或独立于其它策略。在506处,接收合成目标对象的命令。例如,应用程序的启动可使得对合成的请求在该应用程序的运行时出现。在508处,可分析与目标对象相关联的上下文,其中上下文涉及与该应用程序相关联的现有实体、关系、实例、类等。在510处,至少部分地基于该上下文执行多个合成策略中的至少一个。例如,合成策略可涉及创建对象、修改引用、创建关系或任何其它合适的动作。此外,合成策略可以独立于或依赖于一个或多个完全不同的策略,并且可按取决于上下文和/或政策的特定次序来执行。方法500然后在512处完成。
现在参考图6,示出了用于通过可扩展框架来合成对象的方法600。方法600在602处开始,并在604处接收多个合成策略。多个合成样式和要求可通过将实际合成工作委托给多个策略中的一个子集来实现。此外,每一策略可涉及一特定样式的合成,并且可以依赖于或不依赖于之前或之后运行的其它合成来完成其工作。在606处,执行应用程序,并且在608处,接收合成目标对象的命令。该命令例如可在执行应用程序时自动生成。此外,该命令可以是泛型(generic)的,这表现在当前不存在任何目标对象,而是合成策略在多个对象上运行(由此策略被泛型地执行,并且命令最初不涉及任何特定对象)。在610处,确定与应用程序相关联的上下文,其中该上下文包括该应用程序内或与该应用程序相关的实体以及应用程序配置。在612处,至少部分地基于上下文来执行多个合成策略中的至少两个,其中这些策略可并行或顺序地(以特定次序)执行。例如,取决于上下文,第一合成策略可要求第二合成策略在该第一策略之前。因此,第二合成策略应在第一合成策略之前实现。类似地,第一合成策略可要求第二合成策略并行执行。方法600然后在614处完成。
共同参考图7-13,描述了可通过策略来执行的各种任务。尽管被分开示出,但是本领域的技术人员可以理解,可提供涉及这些图中所描述的任何或所有方法的组合的多个策略。具体地,转向图7,示出了用于通过利用一个或多个策略来进行构造函数依赖性注入的方法700。方法700在702处开始,并在704处接收合成策略,其中策略旨在用于构造函数依赖性注入。在706处,分析与目标对象相关联的上下文。在方法700中,目标对象可以是期望创建的对象实例。在708处,根据所接收到的策略(或多个策略)来执行构造函数依赖性注入。如上所述,构造函数依赖性注入涉及在运行时发现类构造函数的要求、解析这些要求以确定应检索或创建的对象、然后当创建这些对象时将这些对象传递给目标对象的构造函数。面向对象的程序设计中的构造函数是用于创建对象的新实例的方法,并且可接收参数。策略可用使得可自动推理将什么传递给构造函数的方式来设计,其中推理可通过策略和政策来控制。方法700在710处完成。
现在参考图8,示出了用于通过利用策略来进行设置函数注入的方法800。方法800在802处开始,并且在804处接收合成策略,其中这一策略可用于设置函数注入。设置函数注入涉及在已创建对象上自动设置特性并调用方法。设置函数注入类似于构造函数依赖性注入,除了对于设置函数注入,所讨论的对象已经存在之外。然而,推断要设置哪些特性以及要调用哪些方法可通过推理来实现。如上所述,这一推理可基于对上下文中的对象类型、与对象相关联的元数据(例如,在XML配置文件中、在开发者提供的代码中…)的分析。在806处,分析与目标对象相关联的上下文。例如,对上下文的分析可提供用于上述推理的元数据。在808处,对目标对象执行设置函数注入。方法800然后在810处完成。
现在转向图9,示出了用于基于策略用于注册对象并将其储存在容器中的方法900。方法900在902处开始,并且在904处接收策略。策略可涉及注册目标对象,其中这一对象可以是新创建的和/或预先存在的(该对象是目标对象)。在906处,分析与这一对象相关联的上下文来获得与目标对象有关的元数据。该元数据然后可结合策略来使用。在908处,根据该策略来执行目标对象的注册和存储。将对象注册并存储到容器中涉及通知系统,对象应被记住以供将来使用。由此,当通过检查来解析对于对象的要求时,可对容器进行语法分析以确定预先存在的对象是否对特定需求合适,或者是否希望创建新对象。如上所述,策略可以与一个或多个推理相关联、可根据所分析的元数据来运行、和/或可根据特定命令来操作。例如,如果程序员显式地规定一对象应被注册和存储,则策略可相应地运行。方法900然后在910处完成。
现在参考图10,示出了用于基于所接收到的策略在容器内查找对象的方法1000。方法1000在1002处开始,并且在1004处接收涉及在容器内查找对象(例如,目标对象)的策略。在1006处,分析与目标对象相关联的上下文,并且在1008处根据该策略来执行从容器中的对象查找。从容器中检索对象涉及通过推理、元数据、显式命令或其组合来确定对象是否应从容器中检索,或者是否应创建新对象。方法1000在1010处完成。
转向图11,示出了用于在给定特定策略时执行类型映射的方法1100。方法1100在1102处开始,并且在1104处接收涉及类型映射的合成策略。类型映射涉及接口和具体的类,其中接口是关于一特定类的公有方法的定义。通过多态性,另一类只需知道所提供的对象符合接口即可。更详细而言,对象的类型可以是无关的,只要这一对象与特定方法相关联。此外,类型映射可以涉及将一请求的类型转换成更特定的具体类型。在1106处,相对于目标对象来分析上下文,并且在1108处,根据该策略执行类型映射。方法1100然后在1110处完成。
现在参考图12,示出了用于根据接收到的合成策略来执行属性反射的方法1200。方法1200在1202处开始,并且在1204处接收涉及属性反射的定制合成策略。属性反射允许通过在所构建的类上反射来发现和确认一个或多个策略。这可通过利用诸如.NET等支持属性的任何语言来允许。在1206处,分析与目标对象相关联的上下文。在该实例中,上下文可以是与目标对象相关联的特定类。在1208处,根据所接收的策略执行属性反射,并且方法1200然后在1210处完成。
现在转向图13,示出了用于返回代理对象的方法1300。代理对象可作为提供目标对象中声明的方法的不同实现的对象返回。代理在本领域中是公知的,但是在此之前进行代理不可通过利用策略来获得。方法1300在1302处开始,并且在1304处接收涉及提供对象的代理的合成策略。在1306处,分析与对象(目标对象)相关联的上下文,并且在1308处根据该策略来提供代理对象。方法1300然后在1310处结束。
为了提供用于本发明的各方面的附加上下文,图14和以下讨论旨在提供其中可实现本发明的各方面的合适的操作环境1410的简要概括描述。尽管本本发明是在诸如程序模块等可由一个或多个计算机或其它设备执行的计算机可执行指令的一般上下文中描述的,但是本领域的技术人员将认识到,本发明也可结合其它程序模块和/或作为硬件和软件的组合来实现。
然而,一般而言,程序模块包括执行特定的任务或实现特定的抽象数据类型的例程、程序、组件、数据结构等等。操作环境1410仅是合适的操作环境的一个示例,并不旨在对本发明的使用范围或功能提出任何局限。适用于本发明的其它公知的计算机系统、环境和/或配置包括但不限于,个人计算机、手持式或膝上型设备、多处理器系统、基于微处理器的系统、可编程消费电子产品、网络PC、小型机、大型计算机、包括上述系统或设备的分布式计算环境等等。
参考图14,用于实现本发明的各方面的示例性环境1410包括计算机1412。计算机1412包括处理单元1414、系统存储器1416和系统总线1418。系统总线1418将包括但不限于系统存储器1416的系统组件耦合至处理单元1414。处理单元1414可以是各种可用处理器的任一种。双微处理器和其它多处理器体系结构也可用作处理单元1414。
系统总线1918可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、外围总线或外部总线、和/或使用各类总线体系结构的局部总线,这些体系结构包括但不限于,8位总线、工业标准体系结构(ISA)、微通道体系结构(MCA)、扩展ISA(EISA)、智能驱动电子设备(IDE)、VESA局部总线、外围部件互连(PCI),通用串行总线(USB)、高级图形端口(AGP)、个人计算机存储卡国际协会总线(PCMCIA)以及小型计算机系统接口(SCSI)。系统存储器1416包括易失性存储器1420和非易失性存储器1422。基本输入/输出系统(BIOS)包括如在启动时帮助在计算机1412内的元件之间传输信息的基本例程,通常储存在非易失性存储器1422中。作为说明而非局限,非易失性存储器1422可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除ROM(EEPROM)或闪存。易失性存储器1420包括担当外部高速缓存的随机存取存储器(RAM)。作为说明而非局限,RAM以许多形式可用,如同步RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDR SDRAM)、增强型SDRAM(ESDRAM)、同步链路DRAM(SLDRAM)和直接存储器总线(Rambus)RAM(DRRAM)。
计算机1412也包括可移动/不可移动、易失性/非易失性计算机存储介质。例如,图14示出了盘存储1424。盘存储1424包括但不限于,诸如磁盘驱动器、软盘驱动器、磁带驱动器、Jaz驱动器、Zip驱动器、LS-100驱动器、闪存卡或记忆棒等设备。另外,盘存储1424可单独包括存储介质或与其它存储介质组合,其它存储介质包括但不限于,诸如紧致盘ROM设备(CD-ROM)、CD可记录驱动器(CD-R驱动器)、CD可重写驱动器(CD-RW驱动器)或数字多功能盘ROM驱动器(DVD-ROM)等光盘驱动器。为便于盘存储设备1424连接到系统总线1418,通常使用可移动或不可移动接口,如接口1426。
可以理解,图14描述了担当用户和合适的操作环境1410中描述的计算机资源之间的中介的软件。这类软件包括操作系统1428。操作系统1428可储存在盘存储1424中,它用于控制并分配计算机系统1412的资源。系统应用程序1430利用操作系统1428通过储存在系统存储器1416或盘存储1424上的程序模块1432和程序数据1434对资源的管理。可以理解,本发明可用各种操作系统或操作系统的组合来实现。
用户通过输入设备1436向计算机1412输入命令或信息。输入设备1436包括但不限于,诸如鼠标、跟踪球、指示笔、触摸垫等定点设备、键盘、话筒、操纵杆、游戏手柄、圆盘式卫星天线、扫描仪、TV调谐卡、数码相机、数码摄像机、网络摄像头等等。这些和其它输入设备通过系统总线1418经由接口端口1438连接到处理单元1414。接口端口1438包括,例如,串行端口、并行端口、游戏端口和通用串行总线(USB)。输出设备1440使用与输入设备1436相同类型端口中的某一些。由此,例如,USB端口可用于向计算机1412提供输入,并从计算机1412输出信息到输出设备1440。提供了输出适配器1442以说明存在一些输出设备1440,如监视器、扬声器和打印机,以及需要特殊适配器的其它输出设备1440。输出适配器1442包括,作为说明而非局限,提供输出设备1440和系统总线1418之间的连接装置的显卡和声卡。应当注意,其它设备和/或设备的系统提供了输入和输出能力,如远程计算机1444。
计算机1412可以使用到一个或多个远程计算机,如远程计算机1444的逻辑连接在网络化环境中操作。远程计算机1444可以是个人计算机、服务器、路由器、网络PC、工作站、基于微处理器的电器、对等设备或其它常见的网络节点等等,并通常包括相对于计算机1412所描述的许多或所有元件。为简明起见,仅对远程计算机1444示出了存储器存储设备1446。远程计算机1444通过网络接口1448逻辑上连接至计算机1412,然后通过通信连接1450物理地连接。网络接口1448包含诸如局域网(LAN)和广域网(WAN)等通信网络。LAN技术包括光纤分布式数据接口(FDDI)、铜缆分布式数据接口(CDDI)、以太网/IEEE 802.3、令牌环/IEEE 802.5等等。WAN技术包括但不限于,点对点链路、诸如综合业务数字网(ISDN)及其变体等电路交换网络、分组交换网络以及数字用户线(DSL)。
通信连接1450指用于将网络接口1448连接到总线1418的硬件/软件。尽管为说明的清晰起见,示出通信连接1450在计算机1412内,然而它也可以对计算机1412是外部的。仅出于示例性的目的,连接到网络接口1448所必需的硬件/软件包括内部和外部技术,如包括常规电话级调制解调器、线缆调制解调器和DSL调制解调器的调制解调器、ISDN适配器和以太网卡。
图15示出了本发明可与其交互的示例计算环境1500的示意性框图。系统1500包括一个或多个客户机1510。客户机1510可以是硬件和/或软件(如,线程、进程、计算设备)。系统1500也包括一个或多个服务器1530。服务器1530也可以是硬件和/或软件(如,线程、进程、计算设备)。例如,服务器1530可容纳线程,以通过使用本发明执行变换。客户机1510和服务器1530之间的一个可能的通信可以是适用于在两个或多个计算机进程之间传输的数据分组的形式。系统1500包括可用于便于在客户机1510和服务器1530之间通信的通信框架1550。客户机1510操作上连接至可用于储存对客户机1510本地的信息的一个或多个客户机数据存储1560。类似地,服务器1530操作上连接至可用于储存对服务器1530本地的信息的一个或多个服务器数据存储1540。
上文所描述的包括本发明的示例。当然,不可能为了描述本发明而描述组件或方法的每一可想象的组合,但是本领域的普通技术人员可以认识到,本发明的许多另外的组合和置换是可能的。因此,本发明旨在包含落入所附权利要求书的精神和范围中的所有这样的更改、修改和变型。此外,就在说明书和权利要求书中使用术语“包括”而言,这类术语旨在以与术语“包含”用作权利要求书中的过渡词语所解释的类似的方式为包含性的。