WedeNet2018.BussinessLogic-业务逻辑层:
结构如下:

基类:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using WedeNet2018.Infrastructure;
  7. using WedeNet2018.Infrastructure.Components;
  8.  
  9. namespace WedeNet2018.BussinessLogic
  10. {
  11. /// <summary>
  12. /// 业务逻辑层父类
  13. /// </summary>
  14. public abstract class AbsBussinessLogic
  15. {
  16. public AbsBussinessLogic()
  17. {
  18. }
  19.  
  20. /// <summary>
  21. /// 接受一个实现了IUnitOfWorks接口的工作单元实例
  22. /// </summary>
  23. protected IUnitOfWorks _works { get; set; }
  24.  
  25. /// <summary>
  26. /// 当前工作单元的提交方法,可在子类中重写。
  27. /// </summary>
  28. /// <returns></returns>
  29. public virtual int Commit()
  30. {
  31. return _works.Commit();
  32. }
  33. }
  34. }

这个基类的目的主要是实现UnitOfWorks的事务性提交,对于具体业务性的操作放在派生类中。当应用层调用不同的BussinessLogic进行对应的业务处理完毕后,可调用该数据上下文对应的UnitOfWorks实例的Commit()方法统一提交。

实现类如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using WedeNet2018.Infrastructure;
  7. using WedeNet2018.Infrastructure.Components;
  8.  
  9. namespace WedeNet2018.BussinessLogic
  10. {
  11. public class OrdersBussinessLogic : AbsBussinessLogic
  12. {
  13. public OrdersBussinessLogic(IWedeUnitOfWorks works)
  14. {
  15. _works = works;
  16. }
  17.  
  18. public IQueryable<Orders> GetOrders(int orderType){
  19. IQueryable<Orders> ret = null;
  20. ret = _works.All<Orders>().Where(r=>r.OrderType.Equals(orderType));
  21.  
  22. return ret;
  23. }
  24.  
  25. public void Add(Orders order) {
  26. _works.Add<Orders>(order);
  27. }
  28.  
  29. public Orders Find(int id) {
  30. Orders order = _works.Find<Orders>(id);
  31. return order;
  32. }
  33.  
  34. public void Update(Orders order)
  35. {
  36. _works.Update<Orders>(order);
  37. }
  38.  
  39. public void Delete(int id)
  40. {
  41. Orders order = _works.Find<Orders>(id);
  42. _works.Delete<Orders>(order);
  43. }
  44. }
  45. }

异常处理
系统异常(不论是预期的或非预期的)都要抛至业务逻辑层为止,业务层对捕获的异常进行处理。
规则为:
1、使用RealProxy动态织入业务层指定的方法;
2、自定义异常类和Attribute;
3、业务逻辑层以下发生的异常层层上抛至业务逻辑层,并且要日志记录异常发生具体信息;
4、业务逻辑层捕获到下层抛出的异常后可以区分是预期异常还是非预期异常;
5、如果全局异常处理器捕获到了非预期的异常,则统一抛出“未知错误”;
6、可以对捕获的异常再次处理返给客户端;

业务层实现代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using WedeNet2018.Common;
  7. using WedeNet2018.Common.Attributes;
  8. using WedeNet2018.Common.Exceptions;
  9. using WedeNet2018.Infrastructure;
  10. using WedeNet2018.Infrastructure.Components;
  11. using WedeNet2018.Infrastructure.Components.aop;
  12.  
  13. namespace WedeNet2018.BussinessLogic
  14. {
  15. public class OrdersBussinessLogic : AbsBussinessLogic
  16. {
  17. public OrdersBussinessLogic(IWedeUnitOfWorks works)
  18. {
  19. log = LoggerHelper.WedeNetLogger;
  20. //_works = works;
  21.  
  22. #region AOP动态织入
  23. var dynamicProxy = new DynamicProxy<IWedeUnitOfWorks>(works);
  24. dynamicProxy.BeforeExecute += (s, e) =>
  25. {
  26. log.Info(e.MethodName + "方法执行前");
  27. };
  28. dynamicProxy.AfterExecute += (s, e) =>
  29. {
  30. log.Info(e.MethodName + "方法执行后");
  31. };
  32. dynamicProxy.ErrorExecuting += (s, e) =>
  33. {
  34. log.Info(e.MethodName + "方法执行异常");
  35. Type t = works.GetType();
  36. //标注了[CustomFilter]注解的IUnitOfWorks类全局异常处理才生效
  37. if (t.IsDefined(typeof(CustomFilterAttribute), false))
  38. {
  39. throw new CustomException(dynamicProxy.MyException.Message,
  40. dynamicProxy.MyException.InnerException);
  41. }
  42.  
  43. };
  44. //过滤不需要织入的方法
  45. dynamicProxy.Filter = m => (!m.Name.StartsWith("Get") || !m.Name.StartsWith("Find"));
  46. _works = dynamicProxy.GetTransparentProxy() as IWedeUnitOfWorks;
  47. #endregion
  48. }
  49.  
  50. public IQueryable<Orders> GetOrders(int orderType){
  51. IQueryable<Orders> ret = null;
  52. try
  53. {
  54. ret = _works.All<Orders>().Where(r => r.OrderType.Equals(orderType));
  55. }
  56. catch (Exception ex)
  57. {
  58. #region 异常处理
  59. if (ex is CustomException)
  60. {
  61. log.Info("自定义异常:" + ex.Message);
  62. if (ex.InnerException != null)
  63. {
  64. log.Info(ex.InnerException.Message + "发生于" + ex.InnerException.TargetSite.ReflectedType + "类的" + ex.InnerException.TargetSite.Name + "方法。");
  65. }
  66. }
  67. else
  68. {
  69. log.Info("未知异常:" + ex.Message);
  70. if (ex.InnerException != null)
  71. {
  72. log.Info(ex.InnerException.Message + "发生于" + ex.InnerException.TargetSite.ReflectedType + "类的" + ex.InnerException.TargetSite.Name + "方法。");
  73. }
  74. }
  75. #endregion
  76. }
  77. return ret;
  78. }
  79.  
  80. public bool Add(Orders order) {
  81. try
  82. {
  83. _works.Add<Orders>(order);
  84. return true;
  85. }
  86. catch (Exception ex) {
  87. #region 异常处理
  88. if (ex is CustomException)
  89. {
  90. log.Info("自定义异常:" + ex.Message);
  91. if (ex.InnerException != null)
  92. {
  93. log.Info(ex.InnerException.Message + "发生于" + ex.InnerException.TargetSite.ReflectedType + "类的" + ex.InnerException.TargetSite.Name + "方法。");
  94. }
  95. }
  96. else
  97. {
  98. log.Info("未知异常:" + ex.Message);
  99. if (ex.InnerException != null)
  100. {
  101. log.Info(ex.InnerException.Message + "发生于" + ex.InnerException.TargetSite.ReflectedType + "类的" + ex.InnerException.TargetSite.Name + "方法。");
  102. }
  103. }
  104. #endregion
  105. return false;
  106. }
  107. }
  108.  
  109. public Orders Find(int id) {
  110. Orders order = _works.Find<Orders>(id);
  111. return order;
  112. }
  113.  
  114. public bool Update(Orders order)
  115. {
  116. try
  117. {
  118. _works.Update<Orders>(order);
  119. return true;
  120. }
  121. catch (Exception ex)
  122. {
  123. #region 异常处理
  124. if (ex is CustomException)
  125. {
  126. log.Info("自定义异常:" + ex.Message);
  127. if (ex.InnerException != null)
  128. {
  129. log.Info(ex.InnerException.Message + "发生于" + ex.InnerException.TargetSite.ReflectedType + "类的" + ex.InnerException.TargetSite.Name + "方法。");
  130. }
  131. }
  132. else
  133. {
  134. log.Info("未知异常:" + ex.Message);
  135. if (ex.InnerException != null)
  136. {
  137. log.Info(ex.InnerException.Message + "发生于" + ex.InnerException.TargetSite.ReflectedType + "类的" + ex.InnerException.TargetSite.Name + "方法。");
  138. }
  139. }
  140. #endregion
  141. return false;
  142. }
  143. }
  144.  
  145. public bool Delete(int id)
  146. {
  147.  
  148. Orders order = _works.Find<Orders>(id);
  149. try
  150. {
  151. _works.Delete<Orders>(order);
  152. return true;
  153. }
  154. catch (Exception ex)
  155. {
  156. #region 异常处理
  157. if (ex is CustomException)
  158. {
  159. log.Info("自定义异常:" + ex.Message);
  160. if (ex.InnerException != null)
  161. {
  162. log.Info(ex.InnerException.Message + "发生于" + ex.InnerException.TargetSite.ReflectedType + "类的" + ex.InnerException.TargetSite.Name + "方法。");
  163. }
  164. }
  165. else
  166. {
  167. log.Info("未知异常:" + ex.Message);
  168. if (ex.InnerException != null)
  169. {
  170. log.Info(ex.InnerException.Message + "发生于" + ex.InnerException.TargetSite.ReflectedType + "类的" + ex.InnerException.TargetSite.Name + "方法。");
  171. }
  172. }
  173. #endregion
  174. return false;
  175. }
  176. }
  177.  
  178. }
  179. }

动态代理代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Runtime.Remoting.Messaging;
  6. using System.Runtime.Remoting.Proxies;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9.  
  10. namespace WedeNet2018.Infrastructure.Components.aop
  11. {
  12. public class DynamicProxy<T> : RealProxy
  13. {
  14. private readonly T _decorated;
  15. private Predicate<MethodInfo> _filter;
  16. public event EventHandler<IMethodCallMessage> BeforeExecute;
  17. public event EventHandler<IMethodCallMessage> AfterExecute;
  18. public event EventHandler<IMethodCallMessage> ErrorExecuting;
  19. public DynamicProxy(T decorated)
  20. : base(typeof(T))
  21. {
  22. _decorated = decorated;
  23. Filter = m => true;
  24. }
  25. public Predicate<MethodInfo> Filter
  26. {
  27. get { return _filter; }
  28. set
  29. {
  30. if (value == null)
  31. _filter = m => true;
  32. else
  33. _filter = value;
  34. }
  35. }
  36. private void OnBeforeExecute(IMethodCallMessage methodCall)
  37. {
  38. if (BeforeExecute != null)
  39. {
  40. var methodInfo = methodCall.MethodBase as MethodInfo;
  41. if (_filter(methodInfo))
  42. BeforeExecute(this, methodCall);
  43. }
  44. }
  45. private void OnAfterExecute(IMethodCallMessage methodCall)
  46. {
  47. if (AfterExecute != null)
  48. {
  49. var methodInfo = methodCall.MethodBase as MethodInfo;
  50. if (_filter(methodInfo))
  51. AfterExecute(this, methodCall);
  52. }
  53. }
  54. private void OnErrorExecuting(IMethodCallMessage methodCall, Exception ex)
  55. {
  56. if (ErrorExecuting != null)
  57. {
  58. this.MyException = ex;
  59. var methodInfo = methodCall.MethodBase as MethodInfo;
  60. if (_filter(methodInfo))
  61. ErrorExecuting(this, methodCall);
  62. }
  63. }
  64.  
  65. public Exception MyException
  66. {
  67. get;
  68. set;
  69. }
  70.  
  71. public override IMessage Invoke(IMessage msg)
  72. {
  73. var methodCall = msg as IMethodCallMessage;
  74. var methodInfo = methodCall.MethodBase as MethodInfo;
  75. OnBeforeExecute(methodCall);
  76. try
  77. {
  78. var result = methodInfo.Invoke(_decorated, methodCall.InArgs);
  79. OnAfterExecute(methodCall);
  80. return new ReturnMessage(
  81. result, null, 0, methodCall.LogicalCallContext, methodCall);
  82. }
  83. catch (Exception e)
  84. {
  85. //CustomException customException = null; Exception ex = null;
  86. //if (typeof(T).IsDefined(typeof(CustomFilterAttribute), true)) {
  87. // customException = new CustomException(e.Message, e.InnerException);
  88. //}
  89. //if (customException != null)
  90. // ex = customException;
  91. //else
  92. // ex = e;
  93.  
  94. OnErrorExecuting(methodCall, e);
  95. return new ReturnMessage(e, methodCall);
  96. }
  97. }
  98.  
  99. }
  100. }

搭建自己的框架WedeNet(三)的更多相关文章

  1. 搭建自己的框架WedeNet(五)

    WedeNet2018.WedeWcfServices-WCF服务层:结构如下: 就是定义了服务契约接口和服务类,以OrderServices为例,如下: using System; using Sy ...

  2. 搭建自己的框架WedeNet(四)

    WedeNet2018.Web-UI层:结构如下: 首先,在Controller中定义BaseController,以便加入统一处理逻辑,如下: using log4net; using System ...

  3. 搭建自己的框架WedeNet(一)

    框架用到的技术: EF.UnitOfWork+Repository.Ninject.log4net.WCF.MVC.T4.windows服务.AOP前端技术:Bootstrap.layer.jQuer ...

  4. 搭建自己的框架WedeNet(二)

    WedeNet2018.Infrastructure-基础设施层:结构如下: Tools结构如下: 考虑到系统可能会有多个数据上下文(暂时以两个为例),所以根据需要定义两个T4模板用来生成对应的ent ...

  5. 如何搭建MVC + EF 框架

    1.搭建MVC框架 1.1 VS2010:需要安装WPI 安装 ASP.NET MVC 4 和Visual Studio 2010 系统必备组件 如果上述链接无法打开,请访问:http://www.a ...

  6. Xvfb+YSlow+ShowSlow搭建前端性能测试框架 - 前端技术 | TaoBaoUED

    Xvfb+YSlow+ShowSlow搭建前端性能测试框架 - 前端技术 | TaoBaoUED Xvfb+YSlow+ShowSlow搭建前端性能测试框架 作者:黑三 | 时间:2010-07-07 ...

  7. Windows环境搭建Web自动化测试框架Watir

    Windows环境搭建Web自动化测试框架Watir 一.前言     Web自动化测试一直是一个比较迫切的问题,对于现在web开发的敏捷开发,却没有相对应的敏捷测试,故开此主题,一边研究,一边将We ...

  8. 搭建App主流框架_纯代码搭建(OC)

    转载自:http://my.oschina.net/hejunbinlan/blog/529778?fromerr=EmSuX7PR 搭建主流框架界面 源码地址在文章末尾 达成效果 效果图 注:本文部 ...

  9. 【微服务】使用spring cloud搭建微服务框架,整理学习资料

    写在前面 使用spring cloud搭建微服务框架,是我最近最主要的工作之一,一开始我使用bubbo加zookeeper制作了一个基于dubbo的微服务框架,然后被架构师否了,架构师曰:此物过时.随 ...

随机推荐

  1. moogdb操作

    本文转载自 https://my.oschina.net/kakakaka/blog/347954 首先,下载mongdb对JAVA的支持,点击这里下载驱动包,这里博主下载的是2.10.1版. mon ...

  2. shiro中接入单点登录功能

    最近新建的系统中使用了shiro,而shiro框架中包含登录认证和鉴权的功能,因为我们系统要统一接入公司内部的单点登录(isso)系统,所以通过isso的登录用户,需要在shiro中置为已认证,一下提 ...

  3. C语言中函数strcpy ,strncpy ,strlcpy的用法

    strcpy ,strncpy ,strlcpy的用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 1. s ...

  4. python之NLP数据清洗

    1.知识点 """ 安装模块:bs4 nltk gensim nltk:处理英文 1.安装 2.nltk.download() 下载相应的模块 英文数据处理: 1.去掉h ...

  5. 堡垒机直接调用RUN

    两个脚本 Run.vbe   参考https://blog.csdn.net/skypeGNU/article/details/12708221 set ws=wscript.createobject ...

  6. curl指令的坑

    今天使用curl指令构造一个docker api访问,一直得不到预期的结果.调试了半天,发现是网址没加引号. token=$(curl -v -XGET -H >& 由于网址跟了一串参数 ...

  7. 计蒜客 —— 字符串p型编码

    给定一个完全由数字字符('0','1','2',…,'9')构成的字符串 strstr,请写出 strstr 的 pp 型编码串. 例如:字符串122344111可被描述为“1个 1.2 个 2.1 ...

  8. 日常小节----unity小坑记(静态后不可移动和旋转)

    当物体被置为静态时,模型网格是无法移动和旋转的,只有碰撞器可以. 也就是会出现当父物体不为静态,子物体为静态时,运行后旋转移动父物体,子物体模型网格不会跟随旋转移动,但子物体碰撞器会跟随旋转移动. 或 ...

  9. 酷Q插件_SDK———入门与使用

    1.这里使用的是易语言的SDK,所以请看不惯的人自行离开.{wymbf.} 1.2 这里不会直接给你工程,请用动手打代码,动脑思考. 1.3 不知道.不了解酷Q是干嘛的,请访问:https://cqp ...

  10. MySQL知识篇-SQL2

    1 数据库基本操作? (1) 查看数据库 show databases; (2)切换到指定的数据库 use dbname; (3)创建数据库 create database 库名 charset=ut ...