关于SmartObject的讨论
背景
Colin Murphy、Gabriel Malherbe和我在3月份举办过一场关于SmartObject的研讨会,对我们而言,这是一次十分而有趣和必要的讨论,因为在此之前我们3人已就相关问题有过多次的电话交流,我们希望能更好地理解SmartObject及它在企业架构中的定位。我之前写过一篇blog文章(没有发布),认为SmartObject可以被认为是SOA的一种实现,这种看法引起了一些争议和不同意见。之后经过我与一些同事的继续研究,现在我的观点有所改变:
-
SmartObject不完全等同于SOA,虽然它实现了很多SOA的理念-自我管理、安全、日志、可被发现、可维护、异常处理、扩展性、可行性、事务支持、互操作性(计算机之间的沟通能力)、可测试等。
-
也许我们可以认为SmartObject达到了SOA实现成熟度的第2级(总共有5级);
-
我同时对“SmartObject对当今的企业和组织而言已经足够好”这个观点有所保留,它的发展空间还很大;
-
与此同时带来的挑战是:企业可能会投资实现更高成熟度的SOA,而不仅仅是SmartObject。
什么是SmartObject,以下是我们对SmartObject的一些见解:
SmartObject面世前后的差异
在K2.net 2003中,当我们要同外系统交互数据,我们必须在event生成并修改代码。在Blackpearl中,实现这个功能,我们不需要生成代码了,我们实现的方式是“声明”-告诉工具我们要通过SmartObject与外部系统交互。

在K2 Blackpearl中,我们只需要简单的以拖拉的方式就可以通过SmartObject与外部系统交互,不需要代码。

K2 [blackpearl]关于SmartObject的解决方案
K2 SmartObject在企业架构中的定位
下图引自于我在2007年11月某次研讨会上用到的材料,当时为了理解SmartObject我做了一些深入研究,这张架构图目前还经常在其它地方被引用。

SmartObject在K2 blackpearl扮演着流程数据提供者这个非常关键角色,整个K2 blackpearl平台中SmartObject无处不在。关于SmartObject和ServiceObject,有2点你是必须清楚的:
SmartObject Service:
SmartObject:
-
一个类的定义:它的成员(或称为数据)映射到SmartObject Service提供的方法
-
SmartObject能以可视化的方法在K2流程定义中使用,与外部系统交互
-
SmartObject提供了API,能被企业架构中的其它层面方便地使用
最后,SmartObject是数据访问层(Data Access Layer)的一种实现,SmartObject允许你定义和使用自定义的数据提供程式并通过SmartObject的统一界面向外提供功能。
K2 [blackpearl]产品中提供的SmartObject Service
K2已经提供了如下开箱即用(out of box,OOB)的SmartObject Service,包括:
Blackmarket上的SmartObject service
Blackmarket是SourceCode公司以类似于微软CodePlex模式运作的项目(open source,源代码管理、wiki、讨论组、项目分类、支持RSS订阅…),它给开发人员提供了分享代码的公用空间-http://k2underground.com/k2/ProjectLanding.aspx。目前已经有如下的项目:
-
Dynamic SQL Stored Procedure Service-它封装了SQL Server中存贮过程,我计划在今后的项目中大量使用它,因为我想通过使用存贮过程而不是直接使用数据库中的表和列,以达到更好的灵活性和扩展性
-
Dynamic SQL Services
-
SharePoint Users in Groups ServiceObject
-
Office Communication Server Service-整合了OCS,通过它可以发送即时消息
-
Dynamic WebService Service-动态调用web service
-
-
Dynamic SmartObject Service-通过schema组合现有的SmartObject Service生成新的SmartObject Service,效果类似于面向对象中的继承和组合
随着越来越多的人在blackmarket中贡献,将会有越来越多的SmartObject Service。
结论
以下是我在长期研究和讨论SmartObject后的结论:
-
SmartObject使你能更快地提供和实现K2的解决方案。比如,通过它我可以立即使用到AD、SQL Server等不同外部系统中的数据,实施时间大大缩短。从前我们实施项目的时间可以是以星期为单位的(因为需要大量时间构建数据存取层,这意味着大量的代码生时间),现在我们的实施时间以天为单位就可以了。我可以用拖拉的方式在line rule、succeeding rule、preceding rule、email、destination rule、任何可配置的event向导中使用SmartObject,我甚至不需要代码就可以在流程中与外部系统整合。当然我也可以通过C#代码去使用SmartObject,SmartObject API非常清晰简明易懂,基本与使用.net标准的System.Data命名空间类似。
-
SmartObject的另一伟大之外在于,它使得业务人员在定义流程的时候也可以通过它与各种外部系统交互,而业务人员无需也不需要知道后面的细节(数据来自于哪个外部系统、交互数据的方式…)
-
目前在定义业务规则中使用SmartObject需要留意一个问题:SmartObject的方法可能返回非期望的值(无效的值),原因可能是业务人员在提供SmartObject方法的参数中包括了错误的值。
-
在项目的初期或POC中,把数据存贮在SmartBox中是OK的,但长远来说,我们可能不希望把数据存贮在SmartBox中。原因可能是:我们希望对数据的schema有更多的控制权(SmartBox是自动生成的,无法手工控制);我们(或客户)可能不希望所有流程中的数据都存贮在同一个SQL Server数据库中。
-
不要认为有了SmartObject就可以代替数据仓库(Data Warehouse)。没错,SmartObject提供了CRUD的操作,并且操作对象可以来源于不同的系统(SQL Server, Oracle,AD…)。但出于性能的考虑,如果我们在SmartObject中直接对两个数据量非常大的数据源进行了连接(join)匹配操作,我们失去指定join时所使用的Index的机会,这对性能可能会有极大的影响。所以在特定的场景下针对特定的需求(尤其是性能上的需求),让
SmartObject从数据仓库中取得数据是更好的做法。
- SmartObject与VS2008中的LINQ技术会在功能上存在一定的重复,作为微软提出的对象实体和数据服务标准的LINQ会与SmartObject形成某种竞争的关系。很多开发人员会在server event、中间层和UI层直接大量使用LINQ。我个人并没有大量使用LINQ,但我知道它是一种很棒的对象查询语言(Object Query Language)和对象数据映射(OR Mapping)技术。但SmartObject有一点是做得非常出色的:它提供了集中管理和发布的功能,这对于企业架构非常重要。