没用过的熟悉一下(哈哈。打广告啦)
本人就以登陆功能谈下自己对其中的了解有不足之处。请大家多多指教
工厂模式与平常的三层架构有以下不同
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 }
实体层相信大家一定很了解
它就是对各个对象(表)转化为实体
业务逻辑层
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);
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);
然后在建不同类库存放针对不同数据库的具体方法
以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 }
但怎样在业务逻辑层引用关于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; }
还有配置文件中的这一句
<add key="DAL" value="blog.sqldal"/>
有些童学明白啦吧?在这里用啦一下
反射的技术
其中以
Assembly.Load(AssemblyPath)
反射配置文件标注的程序集。然后以CreateInstance(classNamespace)实例化关于sql数据访问层的类
注意CreateInstance()一定是命名空间.类名,否则创建的实例为空
个人建议在建类库时程序集名称与类库的命名空间一致(好引用方便)
总结:
总的来说使用它就是为啦以后程序的更改扩展方便