先说下,这是最近自己在尝试着应用CSLA来开发一个简单的药品进销存系统(winform)过程中遇到的一些情况,也有很多想到的问题和思路,仅供大家娱乐性浏览,也并没有什么科学依据,算是个尝试吧!在文中不仅是单独写框架应用,更多的是自己在从中发现的或者使用的其思想。
先不谈技术,先谈下自己对这个框架小小的理解。
面向对象的抽象、封装、继承、多态想必大家整天挂在嘴边了,如果单单从这几个词来理解感觉真是很抽象,或者它们的这种概括性实在太强,所以拿一个好的框架来学习和理解它们会更好一些,当然除了理论外实际的开发经验是非常重要的,感觉它们就像是无底洞,永远摸不清到底有多深...这个框架也充分的体现和应用了面向对象的这几大概念。
(业务对象)Business object的概念是从05这本书上看到的,也体现了CSLA框架面向的客户--业务,对于开发中常用到的一些功能都封装在了基类中,业务开发人员可以把精力集中在业务对象的创建以及业务的处理上,经过这个小系统的开发尝试确实也体会到了,里面的一些功能,比如数据绑定,对象的状态跟踪,数据验证,撤销等,虽然这些东西在微软产品中也有体现,但都是零散的。而且这几项功能不是独立存在的,而是相互之间存在着关系,下面就先从这几方面谈谈感受。。
数据绑定,记得刚开始学.net时就是从这个开始的,点点拖拖就实现了数据的增删改,绑定机制非常强大,而在之后的应用开发中发现这种绑定只限于简单的,或者说业务比较简单的处理,如果是复杂的话就无用武之地,但在这里也强调了数据绑定,也是无用的吗?不是,在这里就强调业务对象并非只是数据的简单映射,而充满活力的业务数据,比如说,产品与类别,产品中会存在类别ID,但不可能给用户显示这个无法理解的字符,所以在业务对象中它会以产品类别引用的方式存在,在普通的处理中是以视图的方式查询,而在这里强调的是对象,向View提供的智能对象(加工过的数据),所以数据绑定依然有效,而且数据绑定一般会是双向的,无论是绑定界面的修改还是业务对象的修改,它都会做一个显示与数据的统一,在这里存在的问题作者也以控件的形式做了弥补,这种好处之一就是你可以尽情操作你的对象,而不用去管视图的显示(现在是这么回事,不知道复杂的会怎样),所有的这些都会发生在PropertyChange里面。
状态跟踪,每一种对象(非只读对象)都会跟踪自己对象的状态,无论是复杂对象还是单一可编辑对象,而复杂的组合对象的状态跟踪也是由其子对象的状态来决定。状态的跟踪包括IsNew,IsDirty,IsDelete以及一些组合状态组成,对象从创建开始到持久化,这个过程的操作都是由这些状态来决定,所以它们的正确性非常重要,这里自己也遇到过问题,比如,在对象创建时对象应该肯定是新的,在2.0里面是通过字段域的赋值来实现,所以这种赋值并不会触发对象属性的setter,也不会触发makeold这种方法,在3.8里面这种赋值可以使用BypassPropertyChecks或者是SetProperty这种方法来实现,但存在的问题就是对象的初始化必须存在于对象内部,如果创建对象时一些属性需要由外界来决定的话就需要对工厂方法以及重载DataPortal_Create参数来进行参数设置(现在还没想出别的方法),否则如果在客户端进行属性设置的话对象的状态就不理想了,而且执行撤销功能时对象就"坏"了,在更新属性框架内部会判断当前的值是不是新的,如果是新的它就会标识对象为脏对象,在最后Save时会根据当前对象的状态来决定触发哪个数据门户方法。
数据验证,在书中就讨论了程序中验证规则的放置方式,可以说它无处不在,特别是这里说的验证规则不包含web中客户端这种无法信赖的验证,所以这种数据验证会存在于客户端与服务端,框架通过移动对象的概念解决了这种规则共享,而且对验证规则进行了抽象,每个业务对象进行了统一的管理,在2.0以是要手动触发PropertyHasChanged方法来触发,以以上版本中就直接封装在上基类中,上面也提到了如何不触发这种验证。与绑定机制的关系,在绑定数据中觖发修改后会获取是否有错误信息,框架在基类中继承了IDataErrorInfo以及属性更新(具体那个长的忘了怎么写)接口。
撤销,这个功能是我开始学习此框架的主要原因,感觉很爽,开放给用户的就三个方法:拍快照,同意上一次修改,撤销上一次修改。当然这个功能对于web来说肯定不行了,撤销的过程中也会更新对象当前验证状态/错误列表以及对象状态信息。不过这里存在一个问题,就是没有找着一个Apply是把所有快照都删除的,所以要同意了所有的快照后才可以保存,这里好像有一个level的属性来保存快照深度,在保存的时候它判断了是否存在快照,在这里自己也扩展了一个IsUndoable的是否可撤销属性,感觉可以用它来控制按钮状态什么的,不知道是否合理...
以上是刚想到的一些,自己也是想到哪写到哪,有误的地方大家千万别信...