一说到三层架构,我想大家都了解,这里就简单说下,Asp.Net三层架构一般包含:UI层、DAL层、BLL层,其中每层由Model实体类来传递,所以Model也算是三层架构之一了,例外为了数据库的迁移或者更OO点,DAL层就衍生出了IDAL接口。Model就是简单的对应数据库里面的类,DAL层就是主要操作数据库的方法了,BLL这个就看业务了。而DAL层大部分的方法都是差不多,无非就是几个Insert,Update,Delete,Select。

再来说下泛型,这个是2.0才开始有的,算是2.0中一个非常重要的技术了,关于泛型有什么好处优点就不说了,网上一大堆,其实说了也没有什么用,大家在实践中运用了就知道,我觉得泛型一个最核心的地方就是,泛型封装了类型,把类型的定义延迟到了客户端,泛型又像一个类型的模板,只要你定义了一个泛型类,就相当于定义了N个类,每个类的类型不一样而已。

上面我们说了,三层架构中的DAL层一般包括Insert,Update,Delete,Select这几种了,那么在泛型还没有到来之前,我们的程序员兄弟一般是怎么做的,首先为每个实体定义一个DAL接口,比如有个User这个实体对象,那么就有一个IUserDAL这个接口以及UserDAL这个实现类,如果有N个实体,那么差不多就需要N个接口和实现类了,而这些接口中的Insert,Update,Delete,Select的方法签名都是类似的,唯一的不同就是方法参数和返回值的类型了,我们来看下基本的接口定义

public interface IUserDAL
    {
        int Insert(User model);
        int Update(User model);
        int Delete(int id);
        User GetModel(int id);
        DataTable GetList();
    }

那么在一个项目中,像这样的接口定义到处可见,大部分是重复的写法,虽然我们有任劳任怨的代码生成工具为我们效劳,但是从设计角度或者站在新技术的角度看,这些代码就显得很不优雅,很不爽了,我想你的感觉也是这样吧,呵呵O(∩_∩)O~。

当泛型来临时,我们终于可以不看到那么多的重复接口的定义了,终于可以喘一口气了,那么泛型又是怎么实现的呢,在实现之前我们回头看下我们没有泛型的IUserDAL的定义,其中Insert,Update方法就一个User参数,类似的其他接口也就一个参数,只是类型不是User了,可能是Order,或者其他的,在来看下GetModel返回值类型是User,GetList也是一样的,只是这里我们用DataTable这个万能的类型来代替了,但是大家都知道DataTable这个类型臃肿又是弱类型的,在UI层调用的时候又不知道这个DataTable里面到底有什么字段,这个就在开发期带来一定的麻烦。

泛型的实现终于上场了,其实很简单,不就是一对尖括号吗,是的,只要在IUserDAL后面加对尖括号,里面用一个字符代替类型就可以了,哦,对了还要加个泛型约束呢,就是一个where,也就是说,这个泛型的类型只能是引用的类型,不能是值类型,难道你的Model是一个值类型??不可能吧,反正我是不信。那么这个泛型接口的定义就是:

public interface IDAL<T> where T : class
    {
        int Insert(T model);
        int Update(T model);
        int Delete(int id);
        T GetModel(int id);
        IList<T> GetList();
    }

哦,原来那么简单就是加个T把之前的User类型给【换了】就可以啦,我怎么没有想到呢,呜呜,那么在UserDAL这个继承类中就可以明确定义那个泛型的类型了,因为我这个类就是用来实现User这个实体类的(或者说数据库的表吧),这里,UserDAL我们就叫IUserDAL的客户端了。代码如下:

public class UserDAL : IDAL<User>
    {
        #region IDAL<User> 成员

public int Insert(User model)
        {
            //coding
        }

public int Update(User model)
        {
            //coding
        }

public int Delete(object id)
        {
            //coding
        }

public User GetModel(object id)
        {
            //coding
        }

public IList<User> GetList()
        {
            //coding
        }

#endregion
    }

好了,我们解放了DAL和IDAL,那么BLL层可以用泛型吗,当然可以。

我们先来说下,不用泛型的BLL层的实现,这里不考虑BLL的业务的话,那么BLL就是单纯的调用DAL的相关数据库操作方法,也就是那个IUserDAL接口定义的方法了,一般的UserBLL代码如下:

public class UserBLL
    {
        private IUserDAL dal = new UserDAL();

public int Insert(User model)
        {
            return dal.Insert(model);
        }

public int Update(User model)
        {
            return dal.Update(model);
        }
        public int Delete(int id)
        {
            return dal.Delete(id);
        }
        public T GetModel(int id)
        {
            return dal.GetModel(id);
        }
        public DataTable GetList()
        {
            return dal.GetList();
        }
    }

我想这个是最简单的BLL代码了,而且大部分小的项目这样就已经够了,因为没有什么业务嘛,但是如果想这样的代码每个BLL都这样谢,一个项目几十个上百个也这样写真的会累死人的,代码工具虽然可以解决,但是当我们看到那么多的重复代码,相似的代码,真的很心痛,难道你不觉得心痛,如果你不觉得或者也不想去改的话或者以后还是那样写重复的代码,用代码工具帮做的话,我想你的code能力也不会怎么提高,废话一下。

那么用泛型的话,我们就可以为所有的BLL定义一个基类,其他类只要继承下,稍微的根据业务的不同增加点业务代码就可以,甚至都可以不用继承了,我们先看代码的实现吧,搞这行代码才是最好说话的,请看下面代码:

public class BaseBLL<T, D>
        where T : class
        where D : IDAL<T>,new ()
    {
        private D dal = new D();

public virtual int Insert(T model)
        {
            return dal.Insert(model);
        }

public virtual int Update(T model)
        {
            return dal.Update(model);
        }
        public virtual int Delete(object id)
        {
            return dal.Delete(id);
        }
        public virtual T GetModel(object id)
        {
            return dal.GetModel(id);
        }
        public virtual IList<T> GetList()
        {
            return dal.GetList(model);
        }
    }

这个也简单把,也就是把实体类换为T,把IDAL接口换为D,并定义D这个类型的约束,也就是说我的这个D一定是一个实现了IDAL<T>这个接口的,而IDAL尖括号里面的T就是BaseBLL里面的T,看到这里,相信大家都应该明白了,如果你想实现UserBLL,就可以继承BaseBLL这个基类,这里为什么把BaseBLL中的方法定义为virtual呢,原因很简单的,因为你的BLL层的其他类不可能就没有业务,不可能就是简单的调用DAL方法吧,其他的BLL类就可以根据业务去override相关的方法了,UserBLL相应代码如下:

public class UserBLL : BaseBLL<User, UserDAL>
    {
        
     }

如果UserBLL没有任何业务的话,那就不要继承了,在UI直接用BaseBLL这个泛型类就可以,调用也很简单

BaseBLL<User> dal=new BaseBLL<User>();这样就可以了。

Asp.Net 三层架构之泛型应用的更多相关文章

  1. asp.net三层架构 及其中使用泛型获取实体数据介绍

    asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...

  2. ASP.NET三层架构的分析

    BLL   是业务逻辑层   Business   Logic   Layer DAL   是数据访问层   Data   Access   Layer ASP.NET的三层架构(DAL,BLL,UI ...

  3. 新闻公布系统 (Asp.net 三层架构 )

    2012年度课程设计---新闻公布系统(小结)                                                                             ...

  4. ASP.NET三层架构项目创建流程

    1.进入VS2010,新建项目—>Visual C#—>Web—>ASP.NET空Web应用程序,如图所示: 2.在解决方案处右击—>新建项目—>Windows—> ...

  5. ASP.NET三层架构之不确定查询参数个数的查询

    在做三层架构的时候,特别是对表做查询的时候,有时候并不确定查询条件的个数,比如查询学生表:有可能只输入学号,或者姓名,或者性别,总之查询条件的参数个数并不确定,下面是我用List实现传值的代码: 附图 ...

  6. 初学者-asp.net三层架构

    一.概述: 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了“高内聚,低耦合”的思想.是一种总体设计的思想. 1.表现层( ...

  7. asp.net三层架构详解

    一.数据库 /*==============================================================*/ /* DBMS name:      Microsof ...

  8. asp.net三层架构详解(转)

    摘自:http://www.cnblogs.com/cresuccess/archive/2008/12/10/1351675.html 一.数据库             ,)   )     no ...

  9. asp.net三层架构增删改查

    数据库 use master if exists (select * from sysdatabases where name='bond') drop database bond create da ...

随机推荐

  1. Android ImageView src与backgroud

    在XML中添加ImageView时,有两个可以设置图片的地方,一个是android:src,一个是android:background,这两个的区别: src是图片内容,显示在前面的,backgrou ...

  2. 利用print2flashsetup.exe文档转swf

    通过使用Print2Flash您可以轻松的将您的文档转换成真正的Adobe Flash格式,最好的保证您的内容将实际可见,与其他格式相比,它并不存在查看工具的安装问题. Print2Flash中有一个 ...

  3. BW标准数据源初始化设置

    在安装了一干补丁和做好了BW与R3的链接之后(此处有BISIS操心,具体事宜不详),我们就可以登录到R3系统看个究竟了. 磨刀不误砍柴工,先检查一下两边系统的补丁: R3端如下, ,貌似我们是19,通 ...

  4. 由于源码使用是c\c++与oc混编导致Unknown type name 'NSString'

    今天看到个问题,编辑工程提示Unknown type name 'NSString',如下图 解决方案三: 将Compile Sources As 改为 Objective-C++

  5. 降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)

    Linux 在Linux上自动调整屏幕亮度来保护眼睛 - 51CTO.COM -- 介绍了Camera和RedShift这两款工具 How to automatically dim your scre ...

  6. adb使用

    一.使用adb删除系统应用,如Launcher.apk adb root                 获取root权限 adb remount          挂载系统的读写权限 adb she ...

  7. 查看JAVA进程中哪个线程CPU消耗最高

    一,在centos linux 上查看进程占用cpu过高 top  shift+h 查看哪个进程程消耗最高     二,查看JAVA进程中哪个线程消耗最高   2.1 导出java运行的线程信息   ...

  8. SQLSERVER吞噬内存解决记录

    现在手上有一个不大不小的系统,运行了一段时间,因为是24*7不断运行,所以内存逐渐增高,慢慢的会飙到95%以上,然后不得不重启电脑,因为用的是云,怕虚拟机重启down掉起不来,重启操作还只能在凌晨4. ...

  9. .NET Framework 高级开发

    .NET Framework 高级开发 MSDN 这部分帮助介绍与 .NET Framework 相关的高级编程主题. 本节内容 管理 介绍如何管理 Active Directory 中的对象,如何使 ...

  10. 如何通过XShell传输文件

    转载孟光孟叔的博客:  https://learndevops.cn/index.php/2016/06/14/how-to-transfer-file-using-xshell xshell目前最好 ...