目录
前言
接上级通知,准备部门内部培训一次,由于没有找到好的主题,就准备讲一些零散的知识,旨在表达我在编程学习过程中体会到的一些思想,内容很多地方不够完善,还请大家见谅。
泛型的应用
泛型是.Net 2.0中就有的一个新功能,使用泛型类或方式可将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候,可避免运行时强制转换或装箱操作的成本或风险。我们在项目里也经常会使用泛型集合代替ArrayList,例如:
List<FA_User_bean> list = new List<FA_User_bean>();
除此之外,我们还可以将现有的框架扩展支持泛型类,在Dao基类指定一个参数T,同时在增、删、改、查等方法里使用占位符参数T,代码如下:
Dao泛型基类
接着,我们在Dao子类指定参数T为对应的实体对象,这样在调用Dao子类的增、删、改、查方法时参数T也就为对应的实体对象。
使用自定义属性
自定义属性是标识类或属性的一个很好的办法,例如我们可以使用Serializable指示一个类可以序列化。同样,我们也可以使用自定义属性来标识ORM中的Mapping部分。我们现在的框架部分代码如下:
public partial class FA_User_dao : Dao_Base
{
public FA_User_dao()
{
this._propTable = "FA_User";
this._propPK = "fdUserID";
this._propFields = "fdUserID,fdUserPWD,fdUserCreateAt,fdUserName,fdUserDesc";
}
}
虽然功能是可以实现,但我总觉得代码不够优雅,于是使用自定义属性将这些信息标识到实体类里,代码如下:
自定义属性标识实体类
其中的EntityFlag、ColumnFlag就是自定义属性类了,而PrimaryKey、ColumnName就分别用来设置属性是否为主键、对应的列名称。数据实体映射是一个ORM框架的核心,使用自定义属性标识也可进行良好的扩展。像Hibernate除开提供类似自定义属性的注解功能外,还可使用XML配置实体对象映射,另外还可以根据这些配置的信息反向生成数据库结构。
程序的解耦
1)面向接口设计
当我们碰到复杂的业务逻辑时,可能需要使用多个if else动作条件的判断时,如对多种类型的数据库访问,我们可以考虑使用接口来实现,下图为我的IDbExecutor数据库访问接口的类图:
2)细化分解
一个ORM框架不应该只是提供简单的拼接SQL功能,而应该提供更细腻的参数方法。例如Hibernate除开可以使用HQL查询语言,还提供了Criteria条件、Order排序等操作类。个人觉得,提供的条件元素越细,底层越容易分解实现,扩展性越好。
★不使用ORM,直接一整条SQL语句;
★★把SQL分解为查询字段、where和排序条件再进行拼接;
★★★使用ORM框架,将SQL细化分解为多个元素,在底层进行组合实现;
3)多层结构
使用分层结构也可将程序进行解耦。一般的应用程序大都可分为表现层、业务逻辑层、数据访问层3大层,每一层向上提供接口,向下弱耦合,如下图所示:
良好的层次结构的划分,可以降低系统的复杂性,其中的业务层起到了承上启下的作用。如果一个系统架构中缺少了业务层,那么一些类似事物处理等业务逻辑会在表现层和数据层界限中间徘徊不定,造成代码混乱臃肿的情况。当然,对于一些简单的业务流程,业务层仅仅只是完成对数据层中数据对象的简单封装而已。
为解除业务层对数据层的强依赖性,还可在业务层引入接口和创建具体数据对象的工厂,与数据层保持松散弱耦合关系,这样就可最大程度的支持架构的扩展。如PetShop在BLL层就使用这种方法提供对SQLServer和Oracle数据库的访问。
PetShop.BLL.Product
面向切面编程
面向对象编程相比面向过程编程已经是一种质的飞跃,为什么还要有面向切面编程呢?Aspect Oriented Programming(AOP),面向切面编程,是针对业务逻辑处理中的一方面内容提取,以获得过程各部分之间低耦合性的隔离效果。例如,在Java里使用Spring代理就可在服务层轻松的实现对事务的管理。
MemberService服务类
如上代码所示,使用@Transactional标识了的方法整个过程进入事务控制,简单方便灵活,可大大减少了我们的工作量。而在.Net平台下,我们可以使用上下文(Context)+自定义属性(Attribute)对方法调用进行截取,前提是这个类必须从ContextBoundObject类派生,这点让我很懊恼,因为ContextBoundObject不支持泛型类或具有泛型方法的非泛型类,所以.Net下的事务控制我只能想其他办法来实现。
结束语
好了,今天就说到这里,谢谢大家!