一个典型的DAL层的类的代码如下。以前非常复杂的给SQL传参数的代码不见了,我们只需要像调用一个普通的方法一样调用存储过程即可。以前一个字段一个字段读取值的代码也不见了,我们只需要一条记录一条记录的访问即可。
由于这个代码异常简单,我们只需要获取很少的信息就能拼凑完成:该Table的字段信息、Interface的信息。
由于这个代码异常简单,我们只需要获取很少的信息就能拼凑完成:该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功能的代码简化能力。
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,如需转载请自行联系原作者