实例解析继承体系重构及ORM映射
rivilegeOwner")] public interface PrivilegeOwnerExtended : IEntity { [PrimaryKey] int Id { get; } string Name { get; set; } } [Table("PrivilegeOwner", IsView=true)] public interface PrivilegeOwner : PrivilegeOwnerExtended { } [Table("User")] public interface UserExtended : IEntity { [PrimaryKey] int Id { get; } } [Table("select * from User inner join PrivilegeOwner on PrivilegeOwner.Id = User.Id", IsView=true)] public interface User : UserExtended, PrivilegeOwnerExtended { } [Table("LocalUser")] public interface LocalUserExtended : IEntity { [PrimaryKey] int Id { get; } string LoginId { get; set; } string Password { get; set; } } [Table("select * from LocalUser inner join User on User.Id = LocalUser.Id inner join PrivilegeOwner on PrivilegeOwner.Id = LocalUser.Id", IsView=true)] public interface LocalUser : LocalUserExtended, User { [PrimaryKey] new int Id { get; } } [Table("AgentUser")] public interface AgentUserExtended : IEntity { [PrimaryKey] int Id { get; } string LoginId { get; set; } } [Table("select * from AgentUser inner join User on User.Id = AgentUser.Id inner join PrivilegeOwner on PrivilegeOwner.Id = AgentUser.Id", IsView = true)] public interface AgentUser : AgentUserExtended, User { [PrimaryKey] new int Id { get; } } [Table("GhostUser")] public interface GhostUserExtended : IEntity { [PrimaryKey] int Id { get; } } [Table("select * from GhostUser inner join User on User.Id = GhostUser.Id inner join PrivilegeOwner on PrivilegeOwner.Id = GhostUser.Id", IsView=true)] public interface GhostUser : GhostUserExtended, User { [PrimaryKey] new int Id { get; } } [Table("UserGroup")] public interface UserGroupExtended : IEntity { [PrimaryKey] int Id { get; } string Comment { get; set; } } [Table("select * from UserGroup inner join PrivilegeOwner on PrivilegeOwner.Id = UserGroup.Id", IsView=true)] public interface UserGroup : UserGroupExtended, PrivilegeOwner { [PrimaryKey] new int Id { get; } } 3. 重构继承体系 图1-1的继承体系定义客观地说是比较简洁的,我相信也能满足当前的应用需求。重构的目的不是要推翻或者批驳原来的设计,而是尝试使得模型的可扩展性更强。例如,图1-1所示的模型中LocalUser和AgentUser都有一个LoginId,表示他们是可以登录的,那么,完全可以将可登陆语义抽象出来;再如,现在User和UserGroup都继承自PrivilegeOwner对象,代表他们都能赋权限,但是,将PrivilegeOwner作为User和UserGroup的基类会对User和UserGroup将来的扩展带来很大的限制,例如,在这个模型基础上,不能定义一个“不能赋权限”的GuestUser类型,也不能为UserGroup类指定另一个更抽象的Group作为基类,等等。 为了解除这样的限制,我们就要对这个模型进行重构,重构的核心就是使用接口分离以上继承体系中的实体类中的相同概念。重构后的继承体系见下图2: 注意图中表示继承的箭头。 首先,我们将Id和Name属性抽象为一个IdentableEntity接口,它代表了,继承类拥有一个唯一Id和一个Name描述的契约。User和UserGroup都从IdentableEntity继承,遵守该契约。抽象出该契约的目的是,将来有新的,拥有同样I |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |