• Castle学习笔记ActiveRecord配置封装的解决方案


    使用ActiveRecord开发的过程中我想大家都想到过,配置那么多要是不Ctrl+C/Ctrl+V还得自己去记在脑袋里,必然杂弄?

    无论你是使用Hashtable,ArrayList等集合对象来处理还是使用web.config类配置或是使用XML文件单独配置,始终你都得记住或是让你的硬盘帮你记住ActiveRecord的配置串.方便你Ctrl+C/Ctrl+V.

    [使用集合对象处理]
    Hashtable properties = new Hashtable();
    properties.Add(
    "hibernate.connection.driver_class""NHibernate.Driver.SqlClientDriver");
    properties.Add(
    "hibernate.dialect""NHibernate.Dialect.MsSql2000Dialect");
    properties.Ad(
    "hibernate.connection.provider","NHibernate.Connection.DriverConnectionProvider");
    properties.Add(
    "hibernate.connection.connection_string""Data Source=.;
                    Initial Catalog=test;Integrated Security=SSPI");
    InPlaceConfigurationSource source = new InPlaceConfigurationSource();
    source.Add(
    typeof(ActiveRecordBase), properties);

    [使用xml配置节]
    <activerecord>
    <config>
      
    <add key="hibernate.connection.driver_class"  value="NHibernate.Driver.SqlClientDriver" />
      
    <add key="hibernate.dialect"      value="NHibernate.Dialect.MsSql2000Dialect" />
      
    <add key="hibernate.connection.provider" 
           value
    ="NHibernate.Connection.DriverConnectionProvider"/>
      
    <add key="hibernate.connection.connection_string"   
       value
    ="Data Source=.;Initial Catalog=test;Integrated Security=SSPI" />
      
    </config>
    </activerecord>

    使用上面这两种方式是不是都很麻烦,上周我在公司做项目的时候想到去写一个通用方法来处理ActiveRecord,个人觉得很不错,把思想写下来大家分享.

    解决方案分析
    针对这种情况,我的思路是把配置用方法封装起来,通过传递数据库名和项目实体数据程序集给方法,具体的实现交给方法封装方法去搞定,如下示:


    因为Castle所支持的不只是MSSQL这一种数据库,MYSQL,DB2.......也支持,既然是通用方法,那考虑这一点是必要的.这里我采用了工厂模式,定义抽象类和抽象方法,让派生类来实现他,通过工厂根据需要调用不同的实现类方法:
    1public abstract class Initialize
    2{
    3    public abstract void ActiveRecordInit(string dataBase,string model);
    4}

    定义实现类继承于这个抽象类并重写基类方法:
     1public class ConnectionToSQL : Initialize
     2{
     3    public override void ActiveRecordInit(string dataBase,string model)
     4    {
     5        //具体实现这里不贴代码,有需要的朋友E-mail我,
     6        //或者我给个连接下载
     7     }

     8}

     9public class ConnectionToMySQL : Initialize
    10{
    11    public override void ActiveRecordInit(string dataBase,string model)
    12    {
    13        //**********************
    14    }

    15}

    像这样Castle所支持多少数据库都可以通过工厂模式的思想来扩展.然后就是工厂的建立了.根据需要返回不同的操作.
    根据所传参数来决定实力化那一个类进行相关的配置:

     1public class CastleConfigFactroy
     2{
     3   public static Initialize CreateInstance(string type)
     4   {
     5      switch (type)
     6      {
     7         case "SQL"return new ConnectionToSQL();    
     8                     break;
     9         case "MYSQL"return new ConnectionToMySQL(); 
    10                     break;
    11         defaultreturn new ConnectionToSQL();
    12      }

    13   }

    14}

    通过上面这样的思想处理过后,就可以直接调用方法就可以实现配置了.

    1Initialize init=CastleConfigFactroy.CreateInstance("SQL");
    2init.ActiveRecordInit();

    注意:上面的代码只是给个思想,真正实现还是有很大的问题,我相信大家也都看出来了.里面还有很多逻辑都没写出.
    主要原因是周公在催我了,请大家赎我对文章不负责之错,实在是没精神了.
  • 相关阅读:
    leetcode 153. Find Minimum in Rotated Sorted Array 寻找旋转排序数组中的最小值(中)
    Python写实用小工具实现图片转字符画
    leetcode 215. Kth Largest Element in an Array 数组中的第K个最大元素
    leetcode 75. Sort Colors 颜色分类
    leetcode 347. Top K Frequent Elements 前 K 个高频元素
    记一次 异常断电导致测试服务器无法正常启动,默认进入救援模式(Redhat 7.8)
    NTP: 时钟源管理
    获取MobaXterm 保存的账号密码
    k8s 问题记录:MYSQL_USER="root", MYSQL_PASSWORD cannot be used for the root user
    K8S报错整理_kubectl: Error from server: error dialing backend: remote error: tls: internal error
  • 原文地址:https://www.cnblogs.com/beniao/p/979087.html
Copyright © 2020-2023  润新知