系列目录

前言:

    这应该是本系统最后一次重构,将重构BLL层和Model层。来完全取代代码生成器生成的BLL层和DAL层。完全废掉了代码生成器的DAL,BLL,MODEL层。

    全自动生成增,删,改,查的通用方法和模型转换与BLL层的模型事务脱离,后续文章,会以一些插件或功能为目的,继续完善,进行分享,最后60节的文章会对本系统做一个总结

  (但是还没时间写,相信60节的文章能让你快速了解到本系统的优势和架构,就算你从未阅读之前的所有文章)

    

   继上次的DAL层重构(上一节),本来只想重构DAL层算了,但是鉴于本人是代码强迫症患者,所以花了些时间把BLL层重构。

   在此务必共鸣一个问题,代码重构不是架构改变,这个系统的架构完全还是原来的接口多层注入架构!如下图所示完全不变

 

  最后必须让初学者理解一个知识点:分部类 partial 关键字,因为我们的重构是围绕分部类而实现,包括接口

partial 关键字指示可在命名空间中定义该类、结构或接口的其他部分。所有部分都必须使用 partial 关键字。在编译时,各个部分都必须可用来形成最终的类型。各个部分必须具有相同的可访问性,如 publicprivate 等。

如果将任意部分声明为抽象的,则整个类型都被视为抽象的。如果将任意部分声明为密封的,则整个类型都被视为密封的。如果任意部分声明基类型,则整个类型都将继承该类。

指定基类的所有部分必须一致,但忽略基类的部分仍继承该基类型。各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用。最终类型是所有部分在编译时的组合。

下列声明:

partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

等效于下列声明:

class Earth : Planet, IRotate, IRevolve { }

1.改变现状

  相比我们DAL层,重构BLL层是有技术难度的,因为业务层涉及模型的转换构成,虽然只重构模块的(增、删、改、查),下面我们开始

   下载上一节代码(https://yunpan.cn/cYUdjssbmiLrL  访问密码 e622)来分析业务层。

  分析:IBLL,BLL

  IBLL层不用说了,跟IDAL层是一致的

所以我们直接复制IDAL的TT模版修改后如下

 ICommonBLL.tt

非常好。业务层完成跟预期是一样的!这样我们直接可以看到我们原来的ISysSample可以由

using System.Collections.Generic;
using Apps.Common;
using Apps.Models.Sys;
namespace Apps.IBLL
{public interface ISysSampleBLL{List<SysSampleModel> GetList(ref GridPager pager, string queryStr);bool Create(ref ValidationErrors errors, SysSampleModel model);bool Delete(ref ValidationErrors errors, string id);bool Delete(ref ValidationErrors errors, string[] deleteCollection);bool Edit(ref ValidationErrors errors, SysSampleModel model);SysSampleModel GetById(string id);bool IsExist(string id);}
}

变为--->

using System.Collections.Generic;
using Apps.Common;
using Apps.Models.Sys;
namespace Apps.IBLL
{public partial interface ISysSampleBLL{}
}

代码行数发生质的改变,可以我们就可以扩展自己的接口方法,利用partial类

照样画葫芦,业务层也生成

直接上TT代码

 CommonBLL.tt

由于每一个业务模型的属性都不一致,这里不能用List<T>来做,所以,一个表会生成一个BLL类。(图中红色部分)

如果生成红色部分。主要看下面代码

<#
if (simpleProperties.Any())
{
foreach(var edmProperty in simpleProperties)
{
#><#=edmProperty#> = r.<#=edmProperty#>,
<#
}
}
#>       

获取表模型的所有属性,所有这段对很多人是有帮助的,请收藏,说不定你以后要用到

OK,编译通过,运行正确,还是熟悉的面孔

但是至此。我们的业务层和数据访问层,可以说是一行代码都没写。足够体现了TT模版的强大之处,相比我们之前要用代码生成器来得极其方便

2.引发问题

直到上面步骤,一切都很顺利,没有一点不妥。

有经验的园友会发现,里面东西都是写死的。而且分部类不可以重写自己。

比如说。我在处理 entity.Name = model.Name;时候我想entity.Name = model.Name.TrimStart() 去掉字符串前面的空格,那么可以看到根本无法操作。

然而我们需要重写,但是又发现无法重写分部类的方法,怎么做?必须用一张图来看,我是这么做的

  1. 绿色是我们已经重构完成的。
  2. 紫色是我们需要重构的一个TT模版,这是所有都是虚方法的类
  3. 粉色是我们自己扩张的业务方法,目前为空

虚方法是可以重写的关键字是virtual  以下重写之后优先级高于前者 用override。用代码来说明

改变一下CommonBLL.tt

 VirtualBLL.tt

更Common代码基本一致,只是头部变了,文件名称变了

public class Virtual_SysSampleBLL

那么重新创建一个CommonBLL.tt

 CommonBLL.tt

代码生成后如下,什么都没有实现继承接口,和上面的TT模版的类

namespace Apps.BLL
{public partial class SysSampleBLL: Virtual_SysSampleBLL,ISysSampleBLL{   }
}

好吧,我只是想省掉写: Virtual_SysSampleBLL,ISysSampleBLL

OK,运行之后还是熟悉的面孔,但是可以重载了,我们重载一下,好处理我们的业务!

新建SysSampleBLL.cs

namespace Apps.BLL
{public partial class SysSampleBLL{public override bool Create(ref ValidationErrors errors, SysSampleModel model){try{SysSample entity = m_Rep.GetById(model.Id);if (entity != null){errors.Add(Resource.PrimaryRepeat);return false;}entity = new SysSample();entity.Id = model.Id;entity.Name = model.Name.TrimStart();entity.Age = model.Age;entity.Bir = model.Bir;entity.Photo = model.Photo;entity.Note = model.Note;entity.CreateTime = model.CreateTime;if (m_Rep.Create(entity)){return true;}else{errors.Add(Resource.InsertFail);return false;}}catch (Exception ex){errors.Add(ex.Message);ExceptionHander.WriteException(ex);return false;}}}
}

同样的。我们可以对Model层进行重构,类似BLL层。利用虚属性,可以对属性进行注解。来获得优先级,和一次生成编译通过

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码已从模板生成。
//
//     手动更改此文件可能导致应用程序出现意外的行为。
//     如果重新生成代码,将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------using Apps.Models;
using System;
namespace Apps.Models.Sys
{public class Virtual_SysSampleModel{public virtual string Id { get; set; }public virtual string Name { get; set; }public virtual Nullable<int> Age { get; set; }public virtual Nullable<System.DateTime> Bir { get; set; }public virtual string Photo { get; set; }public virtual string Note { get; set; }public virtual Nullable<System.DateTime> CreateTime { get; set; }}
}

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码已从模板生成。
//
//     手动更改此文件可能导致应用程序出现意外的行为。
//     如果重新生成代码,将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------using Apps.Models;
using System;
namespace Apps.Models.Sys
{public partial class SysSampleModel:Virtual_SysSampleModel{}
}

然后自己建Model对其重载

本文转自ymnets博客园博客,原文链接:http://www.cnblogs.com/ymnets/p/5399190.html,如需转载请自行联系原作者

ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构相关推荐

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 日程管理   http:// ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统

    ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...) 开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联 ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试

    ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试 1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Uni ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级

    系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]

    系列目录 前言 为了符合后面更新后的重构系统,本文于2016-10-31日修正一些截图,文字 我们有了一系列的解决方案,我们将动手搭建新系统吧. 后台系统没有多大的UI视觉,这次我们采用的是标准的左右 ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts

    系列目录 ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fire ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入

    系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统--任务调度系统解析

    系列目录 任务调度系统是什么:他是一个类似Sql Server的代理,他可以帮助你定时处理一些SQL事务 但是他又远远超过代理,因为他还能定时执行一些C#方法,比如定时发送邮件等 总结:任务可以执行的 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(73)-微信公众平台开发-消息管理

    前言 回顾上一节,我们熟悉的了解了消息的请求和响应,这一节我们来建立数据库的表,表的设计蛮复杂 你也可以按自己所分析的情形结构来建表 必须非常熟悉表的结果才能运用这张表,这表表的情形涵盖比较多 思维导 ...

最新文章

  1. python3 多进程 multiprocessing 报错 AttributeError: ‘ForkAwareLocal‘ object has no attribute ‘connection‘
  2. nyoj 42 一笔画问题 (搜索+队列)
  3. mycat两个mysql实例的搭建_Mycat-多实例的搭建
  4. 关于Linux内核的一些问题
  5. ASP.NET Application,Session,Cookie和ViewState等对象用法和区别
  6. python入门书?
  7. foobar2000 for mac(经典音乐播放器)
  8. 飞凌单片机解密_IC芯片解密方法与原理解析
  9. jpg格式电脑怎么弄_(常见问题)如何把HEIC格式图片转换成JPG格式?
  10. Hive常见面试题汇总
  11. Note: LSR LER
  12. 【总结】1111- 如何搞定Banner背景自动换色的功能?
  13. 一款经典动漫改编的二次元日系角色扮演类手游——航海王热血航线
  14. 小白记录:1、scrapy的基础操作
  15. 压缩包密码如何加密解密
  16. VA78L05V6DYE 24V转5V电源 限流电阻参数设计
  17. 要脱大家一起脱:网络实名制与官员财产透明化
  18. VBA编程中常用过程代码
  19. python flask 在线可视化平台系统
  20. 云安全技术——云端应用SQL注入攻击

热门文章

  1. 2019年web前端全集_2019年最佳30+ Web工具
  2. shell学习之定时运行作业
  3. struts的action访问servlet的IOC方式与非IOC方式
  4. 未来PCB行业互联网+发展趋势
  5. Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch
  6. java String.replaceAll中特殊字符问题
  7. 【读书笔记】100个Switf必备tips
  8. 距离传感器 和摇一摇功能
  9. 在CentOS4上安装JMagick
  10. 好书一本:《设计心理学》