c搜索引擎:c# 中 ORM 引擎 ObjTracer来源: 发布时间:星期四, 2009年2月12日 浏览:188次 评论:0
ORM (Object Relation Map)应用已有好多年了它给软件Software开发人员带来了巨大好处其相关产品也不少本文要介绍 ObjTracer 是个相当不错工具它在 MVC(Model, View, Control)模式架构中模型层在该层面上它为后续框架设计提供了支撑 和目前比较流行 ORM 工具相比ObjTracer 在以下方面进行了扩展: 1. 支持抽象类和接口操作(查询、删除、修改) abstract ConsumeCard : BizObj { public double DueAmount {……} public double InitAmount {……} public DateTime InitTime {……} public virtual Guest guest {……} } VipCard : ConsumeCard { Member member {get; }; cardNo {}; override Guest guest { get { member;} { member = value;} } } CommonCard : ConsumeCard { Person person {get; }; override Guest { get { person;} {person = value;} } } ConsumeCard o; 在ObjTracer 中可以非常方便进行如下操作(不管是抽象类、接口、具体类还是被继承类都遵行相同原则): ² 删除对象如删除指定对象 Delete(o)删除指定对象且该对象必须满足指定条件 Delete(o, “DueAmount > 20”)删除满足定条件指定类别对象Delete(ConsumeCard,”DueAmount > 20” AND “Guest = 张 3”)此处“张 3”为Guest 例子对象下同; ² 读取对象如读取指定ID对象Get(ConsumeCard, “ID = 10”)实际上读取是最终具体类对象例子;读取满足定条件对象列表Gets(ConsumeCard, Guest = 张 3); ² 修改指定对象全部属性Update(o);修改指定对象部分属性同时提供条件限制如Update(o,“DueAmount = DueAmount + InitAmount”,Where Guest = 张 3);修改满足指定条件全部对象中部分属性如 Update(ConsumeCard,”DueAmount = DueAmount + 10”, WHERE ” Guest.Name = ‘李 4’ AND Guest Is Member ”) 2. 再复杂类别结构都能很好支持 erface IMember { virtual Name {get}; SeiralNo {get;} Datetime ValidFrom{} Datetime ValidTo{} } Member : Guest,IMember { Person person {get; }; override name { Person.Name;} } Company : IMember { companyName {get; }; address {get;}; Person contactMan{get;} override name { CompanyName;} } Contract : BizObj { IMember member{get;}; DateTime createTime{get;} serialNo; …… } ContractPrepay : BizObj { Contract contract{get;} double amount {get;} Employee casher {get;} } TempContract : Contract { …… } VipContract : Contract { …… } 可以用各种复杂条件对ContractPrepay进行操作如 “Contract.SerialNo = ‘abc009’ OR Contract.Member = member1 OR Contract Is VipContract AND Contract.Member.ValidFrom > ‘2008-8-8’ OR Contract.Member Is Company”; 如果在 Member 数据表中加入冗余 Name 字段( Member Name 使用是其 Person Name实际情况则不定会加入该字段这要根据实际应用情况而定)则可以针对 IMember 使用 Name 来做条件 如果还嫌不够复杂话可以继续深入而且上面针对ContractPrepay操作不受任何影响照样能够完成任务 VipContractPrepay : ContractPrepay { VipContract vipContract {get;} Contract Contract { get { vipContract;} {vipContract = value;} } double Amount {get;} Employee Casher {get;} } 此时可以专门针对VipContractPrepay 进行任意操作 以上所有操作均和数据库结构无关也就是说不管对象和数据表如何映射所有操作都成立 3. 针对类别属性查询使得编程变得更容易 Appo : BizObj { Employee employee{get;} Position position {get;} Bool isValid {get; } …… } 我们可以这样读取某个职位上员工列表GetObjs(Appo, Employee, 条件1条件2)其中 条件1 和条件2 分别表示任职表和员工应满足条件如 GetObjs(Appo,Employee, “isValid = true AND (position = 收银员 OR position.Department.Level = 5)”, “Age > 33”) 也可以GetObjs(Appo,Employee, “isValid = true AND (position = 收银员 OR position.Department.Level = 5) AND Employee.Age > 33”) 4. 相同对象重用减少对数据库访问次数 在次读取多个ContractPrepay对象时其中Contract和Casher可能会有相同例子出现此时会将他们指向相同对象进行共用而不是每个ContractPrepay例子都有自己独立相关这两个属性对象例子如果需要进步读取这些共用对象时可用刷新思路方法完成如 Refresh(contractPrepay1.Casher)这样可避免重复读取相同对象 5. 数据库设计更加灵活继承关系类别可以映射到相同或区别表区别类别可以映射到相同表被继承类(包括接口)属性可以映射到继承类表中这对于提高效率非常有用 并非所有类别都要映射到数据表中这要根据应用系统实际情况来定类别和表间映射复杂程度和代码编写量间是成反比关系也就是说映射关系越复杂实现代码就越简单而代码繁简和数据库操作效率间又是成反比关系数据库操作效率和映射关系复杂程度成正比关系 以合同预付款(ContractPrepay)为例如果系统并不对具体合同预付款(VipContractPrepayTmpContractPrepay)进行编程或对它们并不关心可以考虑不设置具体合同预付款类别表格或将它们和合同预付款表格放在起这对减少代码量和数据库效率都有帮助 也可以考虑只设置具体合同预付款表格映射不设置合同预付款表格这样做也可行此时最好不针对合同预付款对象进行编程而是针对具体合同预付款进行编程这样代码量稍微增加但对数据库效率更有利 当合同预付款和具体合同预付款都映射到区别表格时合同预付款属性放置在哪里要看具体应用系统实际情况作出判断不管放在哪里都不影响编码但对于数据库效率有很大影响 到底如何映射要根据业务实际情况和代码量进行综合权衡 6. 可以同时连接到多个数据源 可以同时连接到多个数据源进行操作但彼此独立不能交叉访问也就是说个对象操作只能在个数据源中进行处理 7. 针对同个类别查询、添加、修改和删除可以分别在区别数据表(或视图)中进行这对于数据库分布在各地应用很有帮助 对于集团应用系统常常各子公司都有独立系统此时可以在集团系统中读取整个集团数据但集团进行添加、修改和删除时局限于自身数据这时只需在集团系统中将对象查询映射到个视图中便可 8. 对重载属性支持保证了针对顶层类进行编程原则得以很好遵守 如要针对ConsumeCard.Guest进行编程ObjTracer 会自动定位到VipCard.Member和CommonCard.Person 上面当然直接对后面两种情况进行编程有利于数据库效率 9. 编程更贴近对象利用复合属性可以非常简洁解决复杂条件操作 直接针对属性进行编程无须考虑数据映射代码简洁且大大减少了工作量如 Contract.Member.ContactMan.Country 可以延伸到任何有映射地方 10. 可以跨越类别进行查询和统计; ObjTracer 提供灵活自定义查询统计策略也是针对类别属性进行编程可以根据需要生成特殊要求查询 11. 可以针对部分属性进行(修改、查询) 查询和修改时可以指定属性范围而不必牵涉到所有属性从而提高效率针对些敏感数据可能需要专门业务逻辑去修改以便保证其安全该功能就显得很有用 12. 提供直接使用数据库和存储过程思路方法 可以通过 ObjTracer 直接数据库中和存储过程也可在查询和条件中用数据库 13. 提供对 DTO 支持 有了对 DTO 支持可以大大减轻控制层代码量使得对象包装更轻松 14. 可以控制属性读写方式 每个属性可以指定是否能够读取和写入以及写入时机这对些冗余字段设计非常有用实际应用系统有时会出于安全考虑不允许随便改动某些属性而是通过特别用例才能更改他们这时指定写方式就很有用了 0
相关文章读者评论发表评论 |