且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-01 10:27:04

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

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

谢谢各位阅读,有事您留……

本文转自博客园张占岭(仓储大叔)的博客,原文链接:你必须要知识的架构知识~第四章 抽象类展现代码的层次感,如需转载请自行联系原博主。