以查询功能谈下,三层架构中的工厂模式与其中反射的应用

 相信用过动软代码生成器的童学对其中的工厂模式一定很了解;
没用过的熟悉一下(哈哈。打广告啦)
本人就以登陆功能谈下自己对其中的了解有不足之处。请大家多多指教
工厂模式与平常的三层架构有以下不同
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()一定是命名空间.类名,否则创建的实例为空

个人建议在建类库时程序集名称与类库的命名空间一致(好引用方便)


总结:

总的来说使用它就是为啦以后程序的更改扩展方便


原文地址:https://www.cnblogs.com/zhang888/p/zhang2.html