zl程序教程

您现在的位置是:首页 >  后端

当前栏目

[c#基础]使用抽象工厂实现三层

c#基础抽象 实现 工厂 三层 使用
2023-09-14 09:01:01 时间
复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 using System.Threading.Tasks;

 7 namespace Wolfy.FactoryDAL

 9 public class DataAccess T where T : class

11 //获取配置路径

12 private static readonly string path = System.Configuration.ConfigurationManager.AppSettings["DAL"];

13 private DataAccess() { }

14 /// summary 

15 /// 创建实例 反射创建实例

16 /// /summary 

17 /// param name="type" /param 

18 /// returns /returns 

19 public static T CreateDAL(string type)

21 string className = string.Format(path + ".{0}", type);

22 try

24 return (T)System.Reflection.Assembly.Load(path).CreateInstance(className);

27 catch (Exception ex)

29 throw new Exception(ex.Message.ToString());

33 }
复制代码

Wolfy.IDAL层依赖与Wolfy.Model,其中包含一个基接口IBaseDAL.cs,还有一个用于定义一些基接口中没有方法的接口IUserDAL,继承基接口IBaseDAL T

复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 using System.Threading.Tasks;

 7 namespace Wolfy.IDAL

 9 /// summary 

10 /// 所有的dal基本都有增删改查等功能,提取到dal接口层,

11 /// 所有实现该接口的类必须实现所有的未实现的成员

12 /// /summary 

13 /// typeparam name="T" /typeparam 

14 public interface IBaseDAL T where T : Model.BaseModel, new()

16 bool Add(T model);

17 bool Detele(int ID);

18 bool Update(T model);

19 T GetModel(int ID);

21 }
复制代码
复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 using System.Threading.Tasks;

 7 namespace Wolfy.IDAL

 9 /// summary 

10 /// 需有特殊的方法的 可定义子接口 

11 /// /summary 

12 public interface IUserDAL:IBaseDAL Model.UserModel 

14 /// summary 

15 /// 判断用户名是否存在

16 /// /summary 

17 /// param name="userName" /param 

18 /// returns /returns 

19 bool Exists(string userName);

20 /// summary 

21 /// 登录

22 /// /summary 

23 /// param name="name" /param 

24 /// param name="pwd" /param 

25 /// returns /returns 

26 Model.UserModel Login(string name, string pwd);

28 }
复制代码
复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 using System.Threading.Tasks;

 6 using System.Data;

 7 using System.Data.SqlClient;

 8 namespace Wolfy.DAL

10 public class UserDAL : Wolfy.IDAL.IUserDAL

12 public bool Exists(string userName)

14 string sql = "select count(*) from Users where UserName=@UserName";

15 SqlParameter[] sp = { 

16 new SqlParameter("@UserName",userName)

17 };

19 return (int)SqlHelper.ExecuteScalar(CommandType.Text, sql, sp) 0;

22 public bool Add(Model.UserModel model)

24 string sql = "insert into Users values(@UserName,@UserPwd)";

25 SqlParameter[] sp = { 

26 new SqlParameter("@UserName",model.UserName),

27 new SqlParameter("@UserName",model.Password)

28 };

29 return SqlHelper.ExecuteNonQuery(CommandType.Text, sql, sp) 0;

32 public bool Detele(int ID)

34 string sql = "delete from Users where id=" + ID;

35 return SqlHelper.ExecuteNonQuery(CommandType.Text, sql) 0;

38 public bool Update(Model.UserModel model)

40 string sql = string.Format("update Users set UserName={0},UserPwd={1} where id={2}", model.UserName, model.Password, model.Id);

41 return SqlHelper.ExecuteNonQuery(CommandType.Text, sql) 0;

44 public Model.UserModel GetModel(int ID)

46 string sql = "select * from Users where id=" + ID;

47 DataTable dt = SqlHelper.ExecuteDataTable(sql);

48 if (dt != null dt.Rows.Count 0)

50 return new Model.UserModel() { UserName = dt.Rows[0]["UserName"].ToString(), Password = dt.Rows[0]["UserPwd"].ToString() };

52 else

54 return null;

59 public Model.UserModel Login(string name, string pwd)

61 Model.UserModel model = null;

62 string sql = "select * from Users where UserName=@UserName and UserPwd=@UserPwd";

63 SqlParameter[] sp = { 

64 new SqlParameter("@UserName",name),

65 new SqlParameter("@UserPwd",pwd)

66 };

67 SqlDataReader reader = SqlHelper.ExecuteReader(CommandType.Text, sql, sp);

68 if (reader != null !reader.IsClosed reader.HasRows)

70 model = new Model.UserModel();

71 while (reader.Read())

73 model.Id = Convert.ToInt32(reader[0]);

74 model.UserName = reader[1].ToString();

75 model.Password = reader[2].ToString();

78 reader.Dispose();

79 return model;

82 }
复制代码
复制代码
 1 using System;

 2 using System.Data;

 3 using System.Xml;

 4 using System.Data.SqlClient;

 5 using System.Collections;

 6 using System.Configuration;

 7 using System.IO;

 8 using System.Web;

 11 namespace Wolfy.DAL

 12 {

 13 /// summary 

 14 /// 数据库的通用访问代码

 15 /// 此类为抽象类,不允许实例化,在应用时直接调用即可

 16 /// /summary 

 17 public abstract class SqlHelper

 18 {

 19 //获取数据库连接字符串,其属于静态变量且只读,项目中所有文档可以直接使用,但不能修改

 20 public static readonly string connectionString = ConfigurationManager.ConnectionStrings["SqlConnect"].ConnectionString;

 23 // 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。

 24 private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

 26 /// summary 

 27 ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。

 28 /// 使用参数数组形式提供参数列表 

 29 /// /summary 

 30 /// remarks 

 31 /// 使用示例:

 32 /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

 33 /// /remarks 

 34 /// param name="connectionString" 一个有效的数据库连接字符串 /param 

 35 /// param name="commandType" SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /param 

 36 /// param name="commandText" 存储过程的名字或者 T-SQL 语句 /param 

 37 /// param name="commandParameters" 以数组形式提供SqlCommand命令中用到的参数列表 /param 

 38 /// returns 返回一个数值表示此SqlCommand命令执行后影响的行数 /returns 

 39 public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

 40 {

 41 SqlCommand cmd = new SqlCommand();

 42 using (SqlConnection conn = new SqlConnection(connectionString))

 43 {

 44 //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中

 45 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);

 46 int val = cmd.ExecuteNonQuery();

 47 //清空SqlCommand中的参数列表

 48 cmd.Parameters.Clear();

 49 return val;

 50 }

 51 }

 53 /// summary 

 54 ///执行一条不返回结果的SqlCommand,通过一个已经存在的数据库连接 

 55 /// 使用参数数组提供参数

 56 /// /summary 

 57 /// remarks 

 58 /// 使用示例: 

 59 /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

 60 /// /remarks 

 61 /// param name="conn" 一个现有的数据库连接 /param 

 62 /// param name="commandType" SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /param 

 63 /// param name="commandText" 存储过程的名字或者 T-SQL 语句 /param 

 64 /// param name="commandParameters" 以数组形式提供SqlCommand命令中用到的参数列表 /param 

 65 /// returns 返回一个数值表示此SqlCommand命令执行后影响的行数 /returns 

 66 public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

 67 {

 68 SqlCommand cmd = new SqlCommand();

 69 PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);

 70 int val = cmd.ExecuteNonQuery();

 71 cmd.Parameters.Clear();

 72 return val;

 73 }

 75 /// summary 

 76 /// 执行一条不返回结果的SqlCommand,通过一个已经存在的数据库事物处理 

 77 /// 使用参数数组提供参数

 78 /// /summary 

 79 /// remarks 

 80 /// 使用示例: 

 81 /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

 82 /// /remarks 

 83 /// param name="trans" 一个存在的 sql 事物处理 /param 

 84 /// param name="commandType" SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /param 

 85 /// param name="commandText" 存储过程的名字或者 T-SQL 语句 /param 

 86 /// param name="commandParameters" 以数组形式提供SqlCommand命令中用到的参数列表 /param 

 87 /// returns 返回一个数值表示此SqlCommand命令执行后影响的行数 /returns 

 88 public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

 89 {

 90 SqlCommand cmd = new SqlCommand();

 91 PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);

 92 int val = cmd.ExecuteNonQuery();

 93 cmd.Parameters.Clear();

 94 return val;

 95 }

 97 /// summary 

 98 /// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。

 99 /// 使用参数数组提供参数

100 /// /summary 

101 /// remarks 

102 /// 使用示例: 

103 /// SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

104 /// /remarks 

105 /// param name="connectionString" 一个有效的数据库连接字符串 /param 

106 /// param name="commandType" SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /param 

107 /// param name="commandText" 存储过程的名字或者 T-SQL 语句 /param 

108 /// param name="commandParameters" 以数组形式提供SqlCommand命令中用到的参数列表 /param 

109 /// returns 返回一个包含结果的SqlDataReader /returns 

110 public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

111 {

112 SqlCommand cmd = new SqlCommand();

113 SqlConnection conn = new SqlConnection(connectionString);

114 // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在,

115 //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。

116 //关闭数据库连接,并通过throw再次引发捕捉到的异常。

117 try

118 {

119 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);

120 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

121 cmd.Parameters.Clear();

122 return rdr;

123 }

124 catch

125 {

126 conn.Close();

127 throw;

128 }

129 }

131 /// summary 

132 /// 执行一条返回第一条记录第一列的SqlCommand命令,通过专用的连接字符串。 

133 /// 使用参数数组提供参数

134 /// /summary 

135 /// remarks 

136 /// 使用示例: 

137 /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

138 /// /remarks 

139 /// param name="connectionString" 一个有效的数据库连接字符串 /param 

140 /// param name="commandType" SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /param 

141 /// param name="commandText" 存储过程的名字或者 T-SQL 语句 /param 

142 /// param name="commandParameters" 以数组形式提供SqlCommand命令中用到的参数列表 /param 

143 /// returns 返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型 /returns 

144 public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

145 {

146 SqlCommand cmd = new SqlCommand();

147 using (SqlConnection connection = new SqlConnection(connectionString))

148 {

149 PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);

150 object val = cmd.ExecuteScalar();

151 cmd.Parameters.Clear();

152 return val;

153 }

154 }

156 /// summary 

157 /// 执行一条返回第一条记录第一列的SqlCommand命令,通过已经存在的数据库连接。

158 /// 使用参数数组提供参数

159 /// /summary 

160 /// remarks 

161 /// 使用示例: 

162 /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

163 /// /remarks 

164 /// param name="conn" 一个已经存在的数据库连接 /param 

165 /// param name="commandType" SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /param 

166 /// param name="commandText" 存储过程的名字或者 T-SQL 语句 /param 

167 /// param name="commandParameters" 以数组形式提供SqlCommand命令中用到的参数列表 /param 

168 /// returns 返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型 /returns 

169 public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

170 {

171 SqlCommand cmd = new SqlCommand();

172 PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);

173 object val = cmd.ExecuteScalar();

174 cmd.Parameters.Clear();

175 return val;

176 }

178 /// summary 

179 /// 缓存参数数组

180 /// /summary 

181 /// param name="cacheKey" 参数缓存的键值 /param 

182 /// param name="cmdParms" 被缓存的参数列表 /param 

183 public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters)

184 {

185 parmCache[cacheKey] = commandParameters;

186 }

188 /// summary 

189 /// 获取被缓存的参数

190 /// /summary 

191 /// param name="cacheKey" 用于查找参数的KEY值 /param 

192 /// returns 返回缓存的参数数组 /returns 

193 public static SqlParameter[] GetCachedParameters(string cacheKey)

194 {

195 SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];

196 if (cachedParms == null)

197 return null;

198 //新建一个参数的克隆列表

199 SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];

200 //通过循环为克隆参数列表赋值

201 for (int i = 0, j = cachedParms.Length; i i++)

202 //使用clone方法复制参数列表中的参数

203 clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();

204 return clonedParms;

205 }

207 /// summary 

208 /// 为执行命令准备参数

209 /// /summary 

210 /// param name="cmd" SqlCommand 命令 /param 

211 /// param name="conn" 已经存在的数据库连接 /param 

212 /// param name="trans" 数据库事物处理 /param 

213 /// param name="cmdType" SqlCommand命令类型 (存储过程, T-SQL语句, 等等。) /param 

214 /// param name="cmdText" Command text,T-SQL语句 例如 Select * from Products /param 

215 /// param name="cmdParms" 返回带参数的命令 /param 

216 private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)

217 {

218 //判断数据库连接状态

219 if (conn.State != ConnectionState.Open)

220 conn.Open();

221 cmd.Connection = conn;

222 cmd.CommandText = cmdText;

223 //判断是否需要事物处理

224 if (trans != null)

225 cmd.Transaction = trans;

226 cmd.CommandType = cmdType;

227 if (cmdParms != null)

228 {

229 foreach (SqlParameter parm in cmdParms)

230 cmd.Parameters.Add(parm);

231 }

232 }

234 /// summary 

235 /// 获取dataset数据

236 /// /summary 

237 /// param name="sql" /param 

238 /// returns /returns 

239 public static DataTable ExecuteDataTable(string sql)

240 {

241 using (SqlConnection conn = new SqlConnection(connectionString))

242 {

243 SqlDataAdapter da = new SqlDataAdapter(sql, conn);

244 DataTable dst = new DataTable();

245 da.Fill(dst);

246 return dst;

247 }

248 }

249 }

250 }
复制代码

Wolfy.BLL业务逻辑层中包含了一个用于继承的基类BaseBLL T 和用户业务逻辑UserBLL类,这层依赖Wolfy.IDAL,Wolfy.Model,Wolfy.FactoryDAL库

复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 using System.Threading.Tasks;

 7 namespace Wolfy.BLL

 9 public class BaseBLL T where T : Wolfy.Model.UserModel, new()

11 protected Wolfy.IDAL.IBaseDAL T Dal;

12 public BaseBLL(string type)

14 //通过工厂得到 dal

15 Dal = Wolfy.FactoryDAL.DataAccess Wolfy.IDAL.IBaseDAL T .CreateDAL(type);

17 public virtual bool Add(T model)

19 return Dal.Add(model);

21 public virtual bool Delete(int ID)

22 { return Dal.Detele(ID); }

23 public virtual bool Update(T model)

24 { return Dal.Update(model); }

25 public virtual T GetModel(int ID)

27 return Dal.GetModel(ID);

31 }
复制代码
复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 using System.Threading.Tasks;

 7 namespace Wolfy.BLL

 9 public class UserBLL : BaseBLL Wolfy.Model.UserModel 

11 private const string _Type = "UserDAL";

12 private Wolfy.IDAL.IUserDAL _DAL;

13 public UserBLL()

14 : base(_Type)

16 _DAL = base.Dal as Wolfy.IDAL.IUserDAL;

17 if (_DAL == null)

19 throw new NullReferenceException(_Type);

22 public bool Exists(string userName)

24 return _DAL.Exists(userName);

26 public Model.UserModel Login(string name, string pwd)

27 { return _DAL.Login(name, pwd); }

29 }
复制代码
复制代码
 1 ?xml version="1.0" encoding="utf-8"? 

 2 !--

 3 有关如何配置 ASP.NET 应用程序的详细信息,请访问

 4 http://go.microsoft.com/fwlink/?LinkId=169433

 5 -- 

 6 configuration 

 7 system.web 

 8 compilation debug="true" targetFramework="4.5" / 

 9 httpRuntime targetFramework="4.5" / 

11 /system.web 

12 connectionStrings 

13 add name="SqlConnect" connectionString="server=.;database=Test;uid=sa;pwd=sa"/ 

14 /connectionStrings 

15 appSettings 

16 add key="DAL" value="Wolfy.DAL"/ 

17 /appSettings 

18 /configuration 
复制代码
复制代码
 1 !DOCTYPE html 

 2 html xmlns="http://www.w3.org/1999/xhtml" 

 3 head 

 4 meta http-equiv="Content-Type" content="text/html; charset=utf-8" / 

 5 title wolfy信息系统登录 /title 

 6 script type="text/javascript" src="Scripts/jquery-1.11.0.js" /script 

 7 script type="text/javascript" 

 8 $(function () {

 9 $("#btnLogin").click(function () {

10 var name = $("#txtUserName").val();

11 var pwd = $("#txtPwd").val();

12 $.ajax({

13 url: "Ashx/Login.ashx",

14 data: "name=" + name + " pwd=" + pwd,

15 type: "Post",

16 dataType: "text",

17 success: function (msg) {

18 if (msg == "1") {

19 $("#divMsg").html("登录成功");

20 } else if(msg=="2") {

21 $("#divMsg").html("用户名或密码为空");

22 } else if(msg=="3"){

23 $("#divMsg").html("用户名不存在");

24 } else {

25 $("#divMsg").html("密码错误");

30 });

31 });

32 });

33 /script 

34 /head 

35 body 

36 table 

37 tr 

38 td 用户名: /td 

39 td input type="text" id="txtUserName" name="name" value="admin" / /td 

40 /tr 

41 tr 

42 td 密码: /td 

43 td input type="password" id="txtPwd" name="name" value="admin" / /td 

44 /tr 

45 tr 

46 td colspan="2" input type="button" id="btnLogin" name="name" value="登录" / /td 

47 /tr 

48 /table 

49 div id="divMsg" /div 

50 /body 

51 /html 
复制代码
复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Web;

 6 namespace Wolfy.LoginDemo.Ashx

 8 /// summary 

 9 /// Login 的摘要说明

10 /// /summary 

11 public class Login : IHttpHandler

14 public void ProcessRequest(HttpContext context)

16 context.Response.ContentType = "text/plain";

17 //接收用户名和密码

18 string name = context.Request["name"];

19 string pwd = context.Request["pwd"];

20 if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(pwd))

22 context.Response.Write("2");

24 else

26 BLL.UserBLL bll = new BLL.UserBLL();

27 Model.UserModel model = new Model.UserModel();

28 if (!bll.Exists(name))

30 context.Response.Write("3");

32 else

34 model = bll.Login(name, pwd);

35 if (model != null)

37 //登录成功记入cookie

38 context.Response.Cookies["n"].Value = name;

39 context.Response.Cookies["n"].Expires = DateTime.Now.AddDays(7);

40 context.Response.Cookies["p"].Value = pwd;

41 context.Response.Cookies["p"].Expires = DateTime.Now.AddDays(7);

42 context.Response.Write("1");

51 public bool IsReusable

53 get

55 return false;

59 }
复制代码
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。

转载:http://www.cnblogs.com/wolf-sun/p/3562156.html
设计模式 - 六大设计原则之ISP(接口隔离原则) 接口隔离原则(Interface Segregation Principle, ISP),要求尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含相关的方法。 接口隔离是为了高内聚、低耦合。 在实际的开发中,通常都是先定义好需要开发的接口,并由各个服务去实现。 但是如果没有经过考虑和设计,很可能造成一个接口中包含了众多的接口方法,而这些接口并不一定在每一个类中都需要实现, 这样的接口很难维护, 也不易于扩展,每一次修改验证都有潜在的风险。
基于FineUIMVC的代码生成器(传统三层)v1.0-2 第一篇博客只是粗略说明了一下,其实这个工具真正用话可能大家还要细看下,我今天(连夜)写个例子,截几个图,做一下自定义模板的实例教程,因为代码生成本身是个工具,动画效果都是次要的,主要是工具本身,其中自带的模板并不适合所有开发环境,所以还是侧重模板编写和接口。