有几天没写这方面的文章了,坦白说,没灵感,今天晚上,还是要写点东西,准备说一下抽象类在架构设计中的层次感,其实一说到抽象类,大家第一个就会想到基类,由通用属性和通用方法组成的类,可能定义一些规范,而自身又可以实现一些统一功能的类,这都是抽象类的表现,我不想把书本上的话拿出来说,也不想把某校培训学校名师的话拿来说,我只想从我的代码中说问题,因为大家真正想听的,想看的是这些“术语“在代码中的应用,不是吗?呵呵。
这几天又看了看EF的code first模块,就是把实体类设计好,然后运行后,将用到的类进行数据表的自动生成,我也曾经说过,code first使“面向对象更加面向对象”了,但如果是团队开发的话,这种模块可能会有点乱,给数据统一带来一些坏味道,为何?说一个场景:张三建了一张user表,李四不知道张三建了user表,他希望用到一个用户类型的实体,所以李四也可能建立了一个userbase表,这时,当他们运行程序后,数据库可能会有两个功能相同的用户表,这就是数据上的不统一,其实code first对象小项目还是很不错的选择,大型项目建议还是用database first,即,先设计数据库,再生成实体对象。
用code first说一个抽象类的用法:
首先对于实体表应该会有一个主键,为了保险起见,我们用long类型,也就是sqlserver里的bitint ,C#里int64,保留字是long,代码可能是这样
/// <summary> /// 实体基类 /// </summary> public abstract class BaseEntity { /// <summary> /// 統一主鍵 /// </summary> [Key] [Display(AutoGenerateField = false)] public virtual long ID { get; set; }
}
而继承它的实体,将会享有一个long类型的主键,名为ID,实体代码可能是这样
/// <summary> /// 用户表 /// </summary> public class UserBase : BaseEntity { public UserBase() { } /// <summary> /// 用户名 /// </summary> [Required(MessageType.RequiredField, "UserName")] public string UserName { get; set; } /// <summary> /// 密码 /// </summary> [Required(MessageType.RequiredField, "Password")] public string Password { get; set; } /// <summary> /// 电子邮件 /// </summary> public string Email { get; set; } } 其时,抽象类很多时间是为我们提供一些可以复习的虚方法,它使程序开发更具灵活性和扩展性,同时也不破解面向对象的原则。
代码可能是这样
/// <summary> /// Controller基类 /// </summary> internal abstract class BaseController : System.Web.Mvc.Controller { /// <summary> /// 数据统一操作对象 /// 子类根据自己的具体需要进行创建 /// </summary> protected Data.IRepository _iRepository { get; set; } /// <summary> /// 用户操作权限 /// </summary> protected int UserOperatorRole { get; set; } /// <summary> /// 当前登陆的用户ID /// </summary> protected long Current_UserID { get; set; } }
这是一个controller的基类型,它提供了一个指向数据层的引用,这个引用我们多用接口来表示,即在基类声明一个接口类型,然后在派生类中建立符合这个接口的实例,而建立什么样的实体(SQL数据库的,MYSQL数据库的,内存的等等)操作,由具体的业务决定,具体业务可能是这样
public class HomeController : BaseController { public HomeController() : this(new DataRepository()) { } public HomeController(IRepository iRepository) { _iRepository = iRepository; } ……
}
我们可以看到,在默认情况下,HomeController类型会建立一个DataRepository进行对数据操作实现,当然,在构造方法中,我们会为其它业务流出一个实体的方法,也就是public HomeController(IRepository iRepository) 这个方法。
在抽象方法对项目结构层次感这篇文章中,我们应该可以体会到,在开发项目时,第一要善于将可以抽象的对象进行抽象,第二将可能出现的情况通过抽象类或者接口提前预留出来,这是很重要的。
谢谢各位阅读,有事您留……
本文转自博客园张占岭(仓储大叔)的博客,原文链接:你必须要知识的架构知识~第四章 抽象类展现代码的层次感,如需转载请自行联系原博主。