快速业务通道

实例解析继承体系重构及ORM映射

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
d标识语义的实体时,可以通过继承该契约减少重复定义。

接着,我们抽象出PrivilegeAssignable接口,包含一个PrivilegeOwnerId用以和权限分配表关联,为可赋权限的对象分配权限。这样做的好处还在于,当需要定义新的拥有“可赋权限”概念的实体时,可以直接继承该接口,避免重复定义。

再接着,我们抽象出Loginable和PasswordLoginable接口,分别代表一个可登录对象和一个需要密码才能登录的对象的抽象契约。PasswordLoginable本身也是继承自Loginable的。

最后,我们可以看到,现在User和UserGroup都从IdentableEntity和PrivilegeAssinable继承,遵守“可标识”和“可赋权限”这两个契约;GhostUser,LocalUser和AgentUser都继承自User,并且,LocalUser和AgentUser分别继承自Loginable和PasswordLoginable接口,遵守“需要密码的可登录”和“可登录”契约。

我们可以发现,新的继承体系模型,比原始模型大大增强了可扩展性。例如,如果我们要添加一个不可设置权限的GuestUser对象,只需让User类不继承PrivilegeAssignable而成为所有User的基类,而使用一个新的继承User并实现PrivilegeAssignable的PrivilegeAssignableUser类作为GhostUser、LocalUser和AgentUser的基类;再如,此时,如果要增加一个不能赋权限的Group抽象,我们也可以非常方便的增加一个Group抽象类作为UserGroup的基类,并将原来UserGroup到IdentableEntity的继承,改为Group到IdentableEntity的继承。

4. 对图2的ORM映射

4.1 单表继承体系

采用单表继承体系映射时,我们用一个AllInOne表包含所有实体的所有字段,并用一个FilterMark过滤标志,区分该条纪录的类型,注意只有所有的User,包括抽象的User和所有的UserGroup是可以查询的,其余接口仅仅用于概念抽象。

代码4

[Table(IsView=true)]
public interface IdentableEntity : IEntity
{
[PrimaryKey]
int Id { get; }
string Name { get; set; }
}

[Table(IsView=true)]
public interface Loginable : IEntity
{
string LoginId { get; set; }
}

[Table(IsView=true)]
public interface PasswordLoginable : Loginable
{
string Password { get; set; }
}

[Table(IsView = true)]
public interface PrivilegeAssignable
{
int PrivilegeOwnerId { get; set; }
}

[Table("AllInOne", AdditionalWhere = "FilterMark <= 20", IsView = true)]
public interface User : IdentableEntity, PrivilegeAssignable
{
}

[Table("AllInOne", AdditionalInsert = "FilterMark = 1", AdditionalWhere = "FilterMark = 1")]
public interface LocalUser : User, PasswordLoginable
{
}

[Table("AllInOne", AdditionalInsert="FilterMark = 2", AdditionalWhere="FilterMark = 2")]
public interface AgentUser : User, Loginable
{
}

[Table("AllInOne", AdditionalInsert = "FilterMark = 3", AdditionalWhere = "FilterMark = 3")]
public interface GhostUser : User
{
}

[Table("AllInOne", AdditionalInsert = "FilterMark = 21", AdditionalWhere = "FilterMark = 21")]
public interface UserGroup : IdentableEntity, PrivilegeAssignable
{
string Comment { get; set; }
}

4.2 一实体一具体表

采用一实体一具体表思路进行映射时,要为每个继承层次中的具体的实体定义一个重复包含所有父类字段的表,并在保存数据时,同时,更新字表和所有的父表。表示抽象契约的接口,在每个实现类包含一份

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号