zoukankan      html  css  js  c++  java
  • 你必须要知道的架构知识~第三章 接口用来制定操作的统一性

    在很多教科书中都这样定义“接口”,接口用来定义一种操作的规范,它的命名为I开头,内部元素均为public,接口中的方法与属性只能定义声明,不能实现,它们只能通过子类去实现,这些东西不是我今天要说的重点,我今天要说的接口主要从它为了实现“操作的统一”去说明。

    在Repository模块中,一般将数据层的“增,删,改,查”进行统一的封装,然后调用时,统一来自一个地方,这样可以大大降低维护的成本。在操作统一性上可以从两个方面去看,其一就是接口为操作提供统一的入口,代码可能是这样:

     /// <summary>
        /// 通¨用?数y据Y库a访?问ê接ó口ú
        /// </summary>
        public interface IRepository
        {
            /// <summary>
            /// 更ü新?记?录?
            /// </summary>
            /// <param name="entity"></param>
            void Update<TEntity>(TEntity entity) where TEntity : BaseEntity;
    
            /// <summary>
            /// [批ú量?]更ü新?记?录?
            /// </summary>
            /// <param name="entity"></param>
            void Update<TEntity>(IList<TEntity> list) where TEntity : BaseEntity;
    
            /// <summary>
            /// 插?入?记?录?
            /// </summary>
            void Insert<TEntity>(TEntity entity) where TEntity : BaseEntity;
    
            /// <summary>
            /// [批ú量?]插?入?记?录?
            /// </summary>
            void Insert<TEntity>(IList<TEntity> list) where TEntity : BaseEntity;
    
            /// <summary>
            /// 插?入?记?录?并¢返μ回?刚?刚?立¢即′插?入?的?状′态?视ó图?
            /// </summary>
            TEntity InsertGetIDENTITY<TEntity>(TEntity entity) where TEntity : BaseEntity;
    
            /// <summary>
            /// 删?除y有D多à个?参?数y控?制?的?对?象ó
            /// </summary>
            /// <param name="oArr"></param>
            void Delete<TEntity>(TEntity entity) where TEntity : BaseEntity;
    
            /// <summary>
            /// 返μ回?默?认?结á果?集ˉ
            /// </summary>
            /// <returns></returns>
            IQueryable<TEntity> GetModel<TEntity>() where TEntity : BaseEntity;
    
            /// <summary>
            /// 根ù据Y主÷键ü返μ回?实μ体?
            /// </summary>
            /// <returns></returns>
            TEntity GetModelById<TEntity>(long id) where TEntity : BaseEntity;
    
        }

    即数据层具体实体操作类型中要想对数据表进行CURD操作,必须从IRepository接口的实现类中去调用,这就是操作入口的统—;其实在方法参数中也实现了统一,我们可以看到参数类型为继承了BaseEntity这个类型(接口也是可以的,这里用的是抽象类)的泛型,这体现了传统参数的统一,在.net framworks中“类型的逆变”的特性。

    我们在业务必层或者UI层(小项目可能不用业务层)调用时,代码可能是这样:

    public class HomeController : BaseController
       {
           public HomeController()
               : this(new DataRepository()) { }
    
           public HomeController(IRepository iRepository)
           {
               _iRepository = iRepository;
           }
    
           public ActionResult Index()
           {
               List<UserBase> userList = _iRepository.GetModel<UserBase>().ToList();
    
               return View(userList);
           }
    }
  • 相关阅读:
    Go语言之进阶篇服务器如何知道用户需要什么资源
    Go语言之进阶篇请求报文格式分析
    Go语言之进阶篇实现并发聊天功能
    Go语言之进阶篇文件传输
    Go语言之进阶篇获取文件属性
    Go语言之进阶篇简单版并发服务器
    Go语言之进阶篇TCP相互通信
    Go语言之进阶篇 netcat工具的使用
    HAProxy的高级配置选项-ACL篇之匹配访问路径案例
    HAProxy的高级配置选项-ACL篇之基于文件后缀实现动静分离
  • 原文地址:https://www.cnblogs.com/lori/p/2378824.html
Copyright © 2011-2022 走看看