你必须要知识的架构知识~第四章 抽象类展现代码的层次感

有几天没写这方面的文章了,坦白说,没灵感,今天晚上,还是要写点东西,准备说一下抽象类在架构设计中的层次感,其实一说到抽象类,大家第一个就会想到基类,由通用属性和通用方法组成的类,可能定义一些规范,而自身又可以实现一些统一功能的类,这都是抽象类的表现,我不想把书本上的话拿出来说,也不想把某校培训学校名师的话拿来说,我只想从我的代码中说问题,因为大家真正想听的,想看的是这些“术语“在代码中的应用,不是吗?呵呵。

这几天又看了看EF的code first模块,就是把实体类设计好,然后运行后,将用到的类进行数据表的自动生成,我也曾经说过,code first使“面向对象更加面向对象”了,但如果是团队开发的话,这种模块可能会有点乱,给数据统一带来一些坏味道,为何?说一个场景:张三建了一张user表,李四不知道张三建了user表,他希望用到一个用户类型的实体,所以李四也可能建立了一个userbase表,这时,当他们运行程序后,数据库可能会有两个功能相同的用户表,这就是数据上的不统一,其实code first对象小项目还是很不错的选择,大型项目建议还是用database first,即,先设计数据库,再生成实体对象。

用code first说一个抽象类的用法:

首先对于实体表应该会有一个主键,为了保险起见,我们用long类型,也就是sqlserver里的bitint ,C#里int64,保留字是long,代码可能是这样

image

/// <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) 这个方法。
在抽象方法对项目结构层次感这篇文章中,我们应该可以体会到,在开发项目时,第一要善于将可以抽象的对象进行抽象,第二将可能出现的情况通过抽象类或者接口提前预留出来,这是很重要的。
谢谢各位阅读,有事您留……

你可能感兴趣的:(抽象类)