当前位置: 首页 > news >正文

综合应用WPF/WCF/WF/LINQ之三十:代码生成器之DBMLToDAL

一个典型的DAL层的类的代码如下。以前非常复杂的给SQL传参数的代码不见了,我们只需要像调用一个普通的方法一样调用存储过程即可。以前一个字段一个字段读取值的代码也不见了,我们只需要一条记录一条记录的访问即可。
由于这个代码异常简单,我们只需要获取很少的信息就能拼凑完成:该Table的字段信息、Interface的信息。
    1 using System;
    2 using System.Collections;
    3 using System.Collections.Generic;
    4 using System.Linq;
    5 using System.Text;
    6 using System.Data.Linq;
    7 using Eallies.OA.DAL.Interface;
    8 using Eallies.OA.DAL.DBML;
    9 using Eallies.OA.Info;
   10 using Eallies.OA.Info.Enum;
   11 using Eallies.OA.DAL.Enum;
   12
   13 namespace Eallies.OA.DAL
   14 {
   15     public class FunctionDAL : IFunctionInterface
   16     {
   17         private Database _Database;
   18
   19         public FunctionDAL(Database database)
   20         {
   21             this._Database = database;
   22         }
   23
   24         #region IFunctionInterface Members
   25
   26         public void InsertFunction(FunctionInfo functionInfo)
   27         {
   28             try
   29             {
   30                 this._Database.InsertFunction(functionInfo.FunctionId,
   31                                               functionInfo.FunctionName,
   32                                               functionInfo.FunctionDescription);
   33             }
   34             catch
   35             {
   36                 throw;
   37             }
   38         }
   39
   40         public IList GetFunctionsByFunctionName(String functionName)
   41         {
   42             try
   43             {
   44                 IList value = null;
   45
   46                 ISingleResult<FunctionInfo> results = this._Database.GetFunctionsByFunctionName(functionName);
   47
   48                 foreach (FunctionInfo item in results)
   49                 {
   50                     if (value == null) value = new ArrayList();
   51
   52                     value.Add(item);
   53                 }
   54
   55                 return value;
   56             }
   57             catch
   58             {
   59                 throw;
   60             }
   61         }
   62
   63         #endregion
   64     }
   65 }
  我们列举其中一个代码片断如下。我们可以看到,需要变动的地方很少,大部分代码都已经是固定的了。
    1     if (objMethods[i].ReturnType.Name == "IList")
    2     {
    3         strContentes += string.Format("                ISingleResult<{0}> results = this._Database.{1}({2});" + "\n", strInfo, objMethods[i].Name, objMethods[i].Name.GetParameters(dbml));
    4         strContentes = strContentes + "                " + "\n";
    5         strContentes += string.Format("                foreach ({0} item in results)" + "\n", strInfo);
    6         strContentes = strContentes + "                {" + "\n";
    7         strContentes = strContentes + "                    if (value == null) value = new ArrayList();" + "\n";
    8         strContentes = strContentes + "                    " + "\n";
    9         strContentes = strContentes + "                    value.Add(item);" + "\n";
   10         strContentes = strContentes + "                }" + "\n";
   11         strContentes = strContentes + "                " + "\n";
   12     }
  但是,值得一提的是,这里也需要考虑一些比较复杂的情况:
1、LINQ不支持返回值为Void的情况。如InsertFunction这个方法,我们确定其返回值为Void,但LINQ也会有一个返回的值。因此,在生成DAL层的代码时,我们需要留意返回值为Void的方法,如果Interface的返回值为Void,则不用理会LINQ的返回值。
2、如果Interface返回值为Int32之类的类型,则LINQ可能会有两个参数,其中一个参数即是Interface的返回值。
但不管怎样,尽管需要留意一下这两种情况,DAL层的代码还是非常简单的,如果相对于.NET 2.0的时代来说,那就简单得几乎可以忽略不计了。可以参考综合应用WPF/WCF/WF/LINQ之十四:LINQ的ORM功能的代码简化能力。




本文转自 Eallies 51CTO博客,原文链接:http://blog.51cto.com/eallies/79009,如需转载请自行联系原作者

相关文章:

  • Cocos Creator 音频API控制调频
  • OpenGL ES 之对各种坐标系统的记录理解
  • Git 仓库结构 (二)***
  • 使用WCF Test Client(WcfTestClient.exe) 来测试WCF
  • Internet Connectivity Evaluation Tool
  • CCF201412-2 Z字形扫描 java(100分)
  • [SoftGrid 系列] Microsoft SoftGrid Server 安装篇
  • 只有rman的备份文件恢复过程
  • Perl脚本学习笔记(一)
  • func 安装之艰辛历程
  • SoapUI实践:自动化测试、压力测试、持续集成
  • linux命令之wget
  • 关于同一线程两次调用EnterCriticalSection的测试
  • 顶级MySQL主从复制企业应用
  • Struts2利用拦截器实现权限控制
  • HTML5新特性总结
  • interface和setter,getter
  • Java多线程(4):使用线程池执行定时任务
  • Webpack 4x 之路 ( 四 )
  • 分享一份非常强势的Android面试题
  • 简单数学运算程序(不定期更新)
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端性能优化--懒加载和预加载
  • 我的业余项目总结
  • 新书推荐|Windows黑客编程技术详解
  • 学习Vue.js的五个小例子
  • 阿里云API、SDK和CLI应用实践方案
  • 交换综合实验一
  • (2.2w字)前端单元测试之Jest详解篇
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (SpringBoot)第二章:Spring创建和使用
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (七)理解angular中的module和injector,即依赖注入
  • (正则)提取页面里的img标签
  • ./configure、make、make install 命令
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .md即markdown文件的基本常用编写语法
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net/c# memcached 获取所有缓存键(keys)
  • .net反混淆脱壳工具de4dot的使用
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET运行机制
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [android] 请求码和结果码的作用
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [LeetCode] Binary Tree Preorder Traversal 二叉树的先序遍历
  • [NSSCTF 2nd] web刷题记录
  • [oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙
  • [OpenGL(Win32)] - 3D 轮廓字体
  • [Prism]Composite Application Guidance for WPF(9)——命令