zoukankan      html  css  js  c++  java
  • 以查询功能谈下,三层架构中的工厂模式与其中反射的应用

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

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


    总结:

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


  • 相关阅读:
    【转】全国各地做生意十年的心得,忍不住上来感慨一下,诚信才是根基!
    pbootcms常用标签
    wordpress常用标签
    表格
    dedecms忘记后台密码
    新手建站基础步骤
    zblog常用插件及操作步骤
    织梦建站如何添加视频文件
    #Centos7.4#Shell中判断语句if中-z至-d的意思
    #Centos7.4#Linux虚拟机KVM配置网卡【Requested operation is not valid: network 'br0' is not active】
  • 原文地址:https://www.cnblogs.com/zhang888/p/zhang2.html
Copyright © 2011-2022 走看看