您的位置:时时app平台注册网站 > 编程知识 > C#多态“说来也说”——逻辑层BLL中的多态使用【

C#多态“说来也说”——逻辑层BLL中的多态使用【

2019-10-30 04:19

 上面给出逻辑层代码,假设说普通的用渡进度在那之中,你的代码大概是这般的。

C#多态“说来也说”——逻辑层BLL中的多态使用,

本文版权归新浪和小编丁芯本人合作持有。款待转发,转载和爬虫请注解原来的书文地址 

前些天早晨,有个朋友说学了旷日漫长,依旧没搞懂多态,让本人回顾讲授一下。作者觉着多态在面向多想的三大特征此中,算是最简易的,最难的是雷同轻便的包装。在编写面向对象代码时,怎样让代码可读性更强,除了变量和章程命名规范外,要做的到贰个措施只做生机勃勃件业务,那样的理念是《代码整洁之道》黄金时代书中举足轻重注重的考虑,其实有经历的诸位都希望团结看见的代码是简约,可保证,可读性强的,相信大家也都“有幸”蒙受过几百上千行的代码,更过分的是有个朋友曾经维护二个上万行的Action,夸张的说,调节和测量检验并走通逻辑,三遍要16日,有些人会讲那是职业逻辑不断增添所导致,但本人以为,在这里种场合下,更应有尽量做到三个主意做风度翩翩件职业。笔者也非常的少嗤笑了,关于代码整洁,笔者在大三的时候,就"讥笑"过

卷入亦非今天的主旨,前天咱们要说的是多态,在情侣问小编的时候,小编给她举了上边这么些轻易的例子。

完整总结这些事例来说就是在主导的三层架构个中,DAL层建八个类AdminDal,UserDal。八个类中,都有扩展对象和删除对象地方法,那那时,大家应有给四个类华而不实出一个父类BaseDal<T>,父类中是他们的公共措施,並且父类要求多个泛型T,那样父类的艺术,技术清楚你所要增多只怕去除的object到底是什么样类型的。请看如下代码。尽管五个类的国有措施在父类在那之中,可是他们本人特有的法子,照旧要写在自个儿的Dal层个中。

1   public class UserDal: BaseDal<UserEntity>
2   {
3         
4   }

1   public class AdminDal: BaseDal<AdminEntity>
2     {
3         public void Manage()
4         {
5             Console.WriteLine("管理员管理网站");
6         }
7     }

 1 public class BaseDal<T>
 2     {
 3         public void AddObj(T obj)
 4         {
 5             Console.WriteLine("添加对象成功,对象属于" obj.GetType().ToString());
 6         }
 7 
 8         public void DeleteObj(T obj)
 9         {
10             Console.WriteLine("删除对象成功,对象属于" obj.GetType().ToString());
11         }
12 
13     }

 上面给出逻辑层代码,借使说普通的支出进程此中,你的代码大概是那样的。

 1  public class UserBll 
 2     {
 3         UserDal dal = new UserDal();
 4 
 5         public void Add(UserEntity obj)
 6         {
 7             dal.AddObj(obj);
 8         }
 9 
10         public void Delete(UserEntity obj)
11         {
12             dal.DeleteObj(obj);
13         }
14      }

    public class AdminBll 
    {
        AdminDal dal = new AdminDal();

        public void Add(AdminEntity admin)
        {
            dal.AddObj(admin);
        }
        public void Delete(AdminEntity admin)
        {
            dal.DeleteObj(admin);
        }

        public void Manage()
        {
            dal.Manage();
        }
     }

也正是在个其他逻辑层个中,调用dal层。那时你又来看依然有如此多种复的代码,是还是不是理所应当重新封装成二个BaseBll<T>呢。答案是明确的,然而难题又来了,在卷入父类的进程中,你会意识,那一个dal的靶子怎么封装呢?那正是用到多态的关键点。下边看一下BaseBll.cs的代码。

 public abstract class BaseBll<T> where T:class, new()
    {
        public BaseDal<T> currentDal;

        public BaseBll()
        {
            SetCurrentDal();
        }

        public abstract void SetCurrentDal();


        public void BaseAdd(T obj)
        {
            currentDal.AddObj(obj);
        }

        public void BaseDelete(T obj)
        {
            currentDal.DeleteObj(obj);
        }

    }

自己给了一个抽象的基类,并且付诸抽象的SetCurrentDal的用空想来欺骗别人方法定义。该格局用于安装当前类的currentDal到底是adminDal依然userDal。大家在构造函数中调用SetCurrentDal这一个抽象方法,为何在构造函数中调用的开始和结果是,当实例化子类对象时,一定是率先步向其父类的构造函数。当子类AdminBll和UserBll继承BaseBll<T>的时候,必需重写抽象方法,而且为BaseDal<T> currentDal对象设置实际的值。作者先给出子类的代码

 1 public class AdminBll : BaseBll<AdminEntity>
 2     {
 3         AdminDal dal = new AdminDal();
 4         public AdminBll()
 5         {
 6 
 7         }
 8         public void Manage()
 9         {
10             new AdminDal().Manage();
11         }
12 
13         public override void SetCurrentDal()
14         {
15             currentDal = new AdminDal();
16         }
17     }

1 public class UserBll : BaseBll<UserEntity>
2     {
3         public override void SetCurrentDal()
4         {
5             base.currentDal = new UserDal();
6         }
7     }

当实例化子类的对象时,进程为:子类构造函数(不进来)—步向父类构造函数—父类构造内部调用子类重写的SetCurrentDal(当前多态的currentDal到底是什么人的实例)—父类构造施行落成(设置currentDal达成)—子类构造函数。这正是空虚方法完成的多态。

上边在UI层调用一下,看看结果:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             AdminBll adminBll = new AdminBll();
 6             AdminEntity admin = new AdminEntity() {AdminName="吴双",AdminPwd="123" };
 7             adminBll.Manage();
 8             adminBll.BaseAdd(admin);
 9             Console.ReadKey();
10         }
11     }

出口结果:

时时app平台注册网站 1

 

在付出的经过中,恐怕你会有看不尽实体类,每个实体类都有各自的增加和删除改查等任何共有方法,基于那样的情事,我们就必要一手来将其包装。为啥在逻辑层使用了多态,原因正是大家封装父类的时候,不鲜明当前的currentDal到底是adminDal依然userDal还是xxxDal。为了封装出基类,这几个多态的目的就少不了了。

理当如此在实质被期骗中,倘使你是写原生sql,那样封装的确不便于,各样拼接sql。但如若说你用ORM框架,EF,Dapper之类的,那些艺术确实是须求的,你大概再加上接口层,加上海工业作单元,创造对象非new,使用抽象工厂,依赖注入等。无论怎么着,那豆蔻年华层的多态一定能用到,只是创制对象稍作改良。

 

下风度翩翩阶段也筹划展开后台框架结构搭建分享,MVC WebApi EF/Dapper 职业单元 抽象工厂/正视注入Autofac AutoMapper 日志组件等。

作者也曾数次在品种中搭建此类框架,在缓存升高质量,管理高并发,应用服务器集群,缓存集群,队列集群等方面,本次也会踏向到分享当中。

 

假设后天的简单分享,对您有一点点滴帮衬,请点赞支持,也为温馨的升华点赞。

点击下方关心,大家协同升高。

 

本文版权归果壳网和小编张俊本人协同全部。迎接转发,转发和爬虫请评释最早的作品地址 ht...

1   public class UserDal: BaseDal<UserEntity>
2   {
3         
4   }

1   public class AdminDal: BaseDal<AdminEntity>
2     {
3         public void Manage()
4         {
5             Console.WriteLine("管理员管理网站");
6         }
7     }

 1 public class BaseDal<T>
 2     {
 3         public void AddObj(T obj)
 4         {
 5             Console.WriteLine("添加对象成功,对象属于" obj.GetType().ToString());
 6         }
 7 
 8         public void DeleteObj(T obj)
 9         {
10             Console.WriteLine("删除对象成功,对象属于" obj.GetType().ToString());
11         }
12 
13     }
 1  public class UserBll 
 2     {
 3         UserDal dal = new UserDal();
 4 
 5         public void Add(UserEntity obj)
 6         {
 7             dal.AddObj(obj);
 8         }
 9 
10         public void Delete(UserEntity obj)
11         {
12             dal.DeleteObj(obj);
13         }
14      }

    public class AdminBll 
    {
        AdminDal dal = new AdminDal();

        public void Add(AdminEntity admin)
        {
            dal.AddObj(admin);
        }
        public void Delete(AdminEntity admin)
        {
            dal.DeleteObj(admin);
        }

        public void Manage()
        {
            dal.Manage();
        }
     }

今天清晨,有个朋友说学了绵绵,仍旧没搞懂多态,让自个儿归纳讲授一下。小编认为多态在面向多想的三大特色个中,算是最简便易行的,最难的是左近轻便的包装。在编排面向对象代码时,如何让代码可读性更加强,除了变量和章程命名规范外,要做的到四个措施只做生机勃勃件业务,那样的构思是《代码整洁之道》大器晚成书中第黄金年代重申的沉思,其实有经历的诸位都希望团结观察的代码是简约,可保险,可读性强的,相信大家也都“有幸”遭受过几百上千行的代码,更过分的是有个朋友曾经维护三个上万行的Action,夸张的说,调节和测量检验并走通逻辑,贰次要八天,有些人讲那是专业逻辑不断追加所形成,但自身觉着,在这里种状态下,更应有尽量做到叁个主意做生龙活虎件专门的学业。小编也没多少作弄了,关于代码整洁,笔者在大三的时候,就"作弄"过。

时时app平台注册网站 2

假设几日前的星星落落分享,对你有一点滴支持,请点赞扶植,也为和煦的演变打call。

上边在UI层调用一下,看看结果:

作者给了贰个硕华而不实的基类,何况付诸抽象的SetCurrentDal的空洞方法定义。该办法用于安装当前类的currentDal到底是adminDal照旧userDal。大家在构造函数中调用SetCurrentDal这些抽象方法,为何在构造函数中调用的缘由是,当实例化子类对象时,一定是率先步入其父类的构造函数。当子类AdminBll和UserBll承继BaseBll<T>的时候,必需重写抽象方法,并且为BaseDal<T> currentDal对象设置实际的值。作者先给出子类的代码

 public abstract class BaseBll<T> where T:class, new()
    {
        public BaseDal<T> currentDal;

        public BaseBll()
        {
            SetCurrentDal();
        }

        public abstract void SetCurrentDal();


        public void BaseAdd(T obj)
        {
            currentDal.AddObj(obj);
        }

        public void BaseDelete(T obj)
        {
            currentDal.DeleteObj(obj);
        }

    }

出口结果:

当实例化子类的目的时,进度为:子类构造函数(不进去)—步入父类构造函数—父类构造内部调用子类重写的SetCurrentDal(当前多态的currentDal到底是何人的实例)—父类构造实施完成(设置currentDal达成)—子类构造函数。那正是架空方法达成的多态。

 1 public class AdminBll : BaseBll<AdminEntity>
 2     {
 3         AdminDal dal = new AdminDal();
 4         public AdminBll()
 5         {
 6 
 7         }
 8         public void Manage()
 9         {
10             new AdminDal().Manage();
11         }
12 
13         public override void SetCurrentDal()
14         {
15             currentDal = new AdminDal();
16         }
17     }

1 public class UserBll : BaseBll<UserEntity>
2     {
3         public override void SetCurrentDal()
4         {
5             base.currentDal = new UserDal();
6         }
7     }

完整回顾这一个例子来说就是在主导的三层架构个中,DAL层建四个类AdminDal,UserDal。三个类中,都有扩大对象和删除对象地点法,那这时候,我们应有给八个类大而无当出贰个父类BaseDal<T>,父类中是她们的集体措施,並且父类供给四个泛型T,这样父类的主意,手艺分晓您所要加多也许去除的object到底是哪些项指标。请看如下代码。纵然三个类的共用艺术在父类当中,不过他们本人特有的艺术,依旧要写在和睦的Dal层个中。

自然在骨子里个中,假若你是写原生sql,那样封装的确不便于,各样拼接sql。但假设说你用ORM框架,EF,Dapper之类的,那一个方法真的是必需的,你大概再加上接口层,加上中国人民解放军海军事工业程学院业作单元,成立对象非new,使用抽象工厂,信任注入等。无论怎样,那风流倜傥层的多态一定能用到,只是成立对象稍作修正。

 

下生龙活虎阶段也策画展开后台架构搭建分享,MVC WebApi EF/Dapper 职业单元 抽象工厂/重视注入Autofac AutoMapper 日志组件等。

打包亦不是今天的大旨,几前段时间大家要说的是多态,在爱人问小编的时候,小编给她举了上面那个轻易的事例。

在付出的经过中,恐怕你会有众多实体类,每一个实体类都有各自的增加和删除改查等任何共有方法,基于那样的情形,大家就供给一手来将其包装。为什么在逻辑层使用了多态,原因正是我们封装父类的时候,不分明当前的currentDal到底是adminDal仍然userDal仍然xxxDal。为了封装出基类,这么些多态的目的就必须了。

点击下方关怀,我们协同提高。

 

 

正文版权归搜狐和小编刘毛毛自身协同持有。款待转发,转发和爬虫请表明原来的小说地址 

也正是在分级的逻辑层个中,调用dal层。那时你又看见仍然有那样多种复的代码,是或不是应当重新封装成多个BaseBll<T>呢。答案是自投罗网的,不过难点又来了,在卷入父类的历程中,你会发觉,这一个dal的目的怎么封装呢?那便是用到多态的关键点。上边看一下BaseBll.cs的代码。

 

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             AdminBll adminBll = new AdminBll();
 6             AdminEntity admin = new AdminEntity() {AdminName="吴双",AdminPwd="123" };
 7             adminBll.Manage();
 8             adminBll.BaseAdd(admin);
 9             Console.ReadKey();
10         }
11     }

自己也曾数十回在档次中搭建此类框架,在缓存升高性能,管理高并发,应用服务器集群,缓存集群,队列集群等地点,此次也会投入到分享此中。

本文由时时app平台注册网站发布于编程知识,转载请注明出处:C#多态“说来也说”——逻辑层BLL中的多态使用【

关键词: