没用过的熟悉一下(哈哈。打广告啦)
本人就以登陆功能谈下自己对其中的了解有不足之处。请大家多多指教
工厂模式与平常的三层架构有以下不同
1.从思想上来说。三层架构就不说啦。工厂模式是把数据访问层抽象化,
以应对不同的数据库。
其中成员有:抽象功能成员:它是具体功能的接口层。(核心)
具体功能成员:它是对抽象功能的继承;也是对不同数据库的不同实现
(嘿嘿,有点抽象。)
2.从具体模式来说
工厂模式把原来的数据访问层 又抽象两层
既接口层与具体实现层;
大家看下面代码
假如我们要实现一个网站的简单登陆功能。
我们看下工厂模式的 实现方式
实体层代码 1
/// <summary>
2 /// user_t:用户类
3 /// </summary>
4 [Serializable]
5 public partial class user_t
6 {
7 public user_t()
8 { }
9 #region 用户类
10 private int _userid;
11 private string _name_r;
12 private string _password_r;
13 private string _email_r;
14 private DateTime _time_r = DateTime.Now;
15 /// <summary>
16 ///
17 /// </summary>
18 public int userid
19 {
20 set { _userid = value; }
21 get { return _userid; }
22 }
23 /// <summary>
24 /// 用户名
25 /// </summary>
26 public string name_r
27 {
28 set { _name_r = value; }
29 get { return _name_r; }
30 }
31 /// <summary>
32 /// 密码
33 /// </summary>
34 public string password_r
35 {
36 set { _password_r = value; }
37 get { return _password_r; }
38 }
3 /// </summary>
4 [Serializable]
5 public partial class user_t
6 {
7 public user_t()
8 { }
9 #region 用户类
10 private int _userid;
11 private string _name_r;
12 private string _password_r;
13 private string _email_r;
14 private DateTime _time_r = DateTime.Now;
15 /// <summary>
16 ///
17 /// </summary>
18 public int userid
19 {
20 set { _userid = value; }
21 get { return _userid; }
22 }
23 /// <summary>
24 /// 用户名
25 /// </summary>
26 public string name_r
27 {
28 set { _name_r = value; }
29 get { return _name_r; }
30 }
31 /// <summary>
32 /// 密码
33 /// </summary>
34 public string password_r
35 {
36 set { _password_r = value; }
37 get { return _password_r; }
38 }
实体层相信大家一定很了解
它就是对各个对象(表)转化为实体
业务逻辑层
1 public partial class blog_t
2 {
3 private readonly Iblog_t dal = DataAccess.Createblog_t();
4 public blog_t()
5 { }
6 #region BasicMethod
7
8 /// <summary>
9 /// 得到最大ID
10 /// </summary>
11 public int GetMaxId()
12 {
13 return dal.GetMaxId();
14 }
15
16 /// <summary>
17 /// 是否存在该记录
18 /// </summary>
19 public bool Exists(int blogid)
20 {
21 return dal.Exists(blogid);
2 {
3 private readonly Iblog_t dal = DataAccess.Createblog_t();
4 public blog_t()
5 { }
6 #region BasicMethod
7
8 /// <summary>
9 /// 得到最大ID
10 /// </summary>
11 public int GetMaxId()
12 {
13 return dal.GetMaxId();
14 }
15
16 /// <summary>
17 /// 是否存在该记录
18 /// </summary>
19 public bool Exists(int blogid)
20 {
21 return dal.Exists(blogid);
22 }
业务层是与界面层交互。主要是为啦对各个功能的具体实现
然后看数据访问层这个是重点 1 /// <summary>
在这里我们以msSQL数据库为例但又不确定数据库是否改变
所以在 数据访问以接口方式抽象各种功能
2 /// 接口层blog_t
3 /// </summary>
4 public interface Iblog_t
5 {
6 #region 成员方法
7 /// <summary>
8 /// 得到最大ID
9 /// </summary>
10 int GetMaxId();
11 /// <summary>
12 /// 是否存在该记录
13 /// </summary>
14 bool Exists(int blogid);
3 /// </summary>
4 public interface Iblog_t
5 {
6 #region 成员方法
7 /// <summary>
8 /// 得到最大ID
9 /// </summary>
10 int GetMaxId();
11 /// <summary>
12 /// 是否存在该记录
13 /// </summary>
14 bool Exists(int blogid);
然后在建不同类库存放针对不同数据库的具体方法
以sql数据库为例
1 public partial class blog_t:Iblog_t
2 {
3 public blog_t()
4 {}
5 #region BasicMethod
6
7
8 /// <summary>
9 /// 是否存在该记录
10 /// </summary>
11 public bool Exists(int blogid)
12 {
13 StringBuilder strSql=new StringBuilder();
14 strSql.Append("select count(1) from blog_t");
15 strSql.Append(" where blogid=@blogid");
16 SqlParameter[] parameters = {
17 new SqlParameter("@blogid", SqlDbType.Int,4)
18 };
19 parameters[0].Value = blogid;
20
21 if ((int) DbHelperSQL.ExecuteScalar(CommandType.Text, strSql.ToString(), parameters) > 0)
22 {
23 return true;
24 }
25 else
26 {
27 return false;
28 }
29 }
2 {
3 public blog_t()
4 {}
5 #region BasicMethod
6
7
8 /// <summary>
9 /// 是否存在该记录
10 /// </summary>
11 public bool Exists(int blogid)
12 {
13 StringBuilder strSql=new StringBuilder();
14 strSql.Append("select count(1) from blog_t");
15 strSql.Append(" where blogid=@blogid");
16 SqlParameter[] parameters = {
17 new SqlParameter("@blogid", SqlDbType.Int,4)
18 };
19 parameters[0].Value = blogid;
20
21 if ((int) DbHelperSQL.ExecuteScalar(CommandType.Text, strSql.ToString(), parameters) > 0)
22 {
23 return true;
24 }
25 else
26 {
27 return false;
28 }
29 }
但怎样在业务逻辑层引用关于sql数据库的数据访问层代码那?
大家注意到业务逻辑层的这一句没
1 private readonly Iblog_t dal = DataAccess.Createblog_t();
然后我们再看一下这个类的代码
private static readonly string AssemblyPath = ConfigurationManager.AppSettings["DAL"];
/// <summary>
/// 创建blog_t数据层接口。
/// </summary>
/// //使用缓存
private static object CreateObject(string AssemblyPath, string classNamespace)
{
object objType;
objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace);
return objType;
}
public static blog.idal.Iblog_t Createblog_t()
{
string ClassNamespace = AssemblyPath + ".blog_t";
object objType = CreateObject(AssemblyPath, ClassNamespace);
return (blog.idal.Iblog_t)objType;
}
/// 创建blog_t数据层接口。
/// </summary>
/// //使用缓存
private static object CreateObject(string AssemblyPath, string classNamespace)
{
object objType;
objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace);
return objType;
}
public static blog.idal.Iblog_t Createblog_t()
{
string ClassNamespace = AssemblyPath + ".blog_t";
object objType = CreateObject(AssemblyPath, ClassNamespace);
return (blog.idal.Iblog_t)objType;
}
还有配置文件中的这一句
<add key="DAL" value="blog.sqldal"/>
有些童学明白啦吧?在这里用啦一下
反射的技术
其中以
Assembly.Load(AssemblyPath)
反射配置文件标注的程序集。然后以CreateInstance(classNamespace)实例化关于sql数据访问层的类
注意CreateInstance()一定是命名空间.类名,否则创建的实例为空
个人建议在建类库时程序集名称与类库的命名空间一致(好引用方便)
总结:
总的来说使用它就是为啦以后程序的更改扩展方便