惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Stack Overflow Blog
Stack Overflow Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
L
LangChain Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
Y
Y Combinator Blog
月光博客
月光博客
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
小众软件
小众软件
H
Help Net Security
Last Week in AI
Last Week in AI
B
Blog RSS Feed
宝玉的分享
宝玉的分享
N
Netflix TechBlog - Medium
博客园 - 叶小钗
The GitHub Blog
The GitHub Blog

博客园 - rottenapple

我遇到的Sqlserver2005 SSIS 的Bug SSIS导入Oracle中的性能问题 Excel内容不能正确倒入SSIS? 使用Oracle Generic Connectivity连接SqlServer asp.net下的用户权限管理模块设计 msdn也出现这种错误。。。 为Log4Net添加异常处理模块 - rottenapple - 博客园 今天发现了ibatis.net的一个bug The Visual Studio template information is out of date. asp.net 设计中的页面流程控制的一点想法(讨论贴) - rottenapple - 博客园 New job,New chance 使用强类型DataSet的好处 如何使应用程序只有一个实例在运行 在Framework1.0下同时连接SqlServer和Oracle的一些体会 VS2002 与 IIS6.0的一个bug 利用WSDL2JAVA实现JAVA调用.Net的Web Services(1) T_SQL中的事务处理 SqlCommand的ExecuteNonQuery()方法执行多条T-SQL语句 博客园的Bug
ibatis.net的配置文件设计
rottenapple · 2007-11-09 · via 博客园 - rottenapple

刚开始用ibatis.net的时候,所有的文章都是把配置文件放在了web.config同级目录下,我也就以为这是默认的,没办法修改。
但是随着项目的进行,Config的增多导致必须把ibatis的配置文件统一管理并加入加密的功能,于是又仔细的看了下ibatis的文档和源代码。
看了源代码后清晰了很多,原来高明的作者早就留了接口给我们扩展。佩服一下,比偶强太多了啊。
由于在这个项目中,又在ibatis.net 上面包装了一层,DPSSqlMapper()就是SqlMapper的一个扩展。
1。在DPSSqlMapper()的构造器函数里面,可以如下操作:
 public DPSSqlMapper()
        {
            // Get default mapper
            ConfigureHandler handler = new ConfigureHandler(Configure);
            DomSqlMapBuilder builder = new DomSqlMapBuilder();
            _isqlMapper = builder.ConfigureAndWatch(DPSSqlMapperConst.DEFAULT_SQLMAP_CONFIG_PATH , handler);   
        }
        // filepath locates
        public DPSSqlMapper(string filepath)
        {
            // Get mapper according to map config name
            ConfigureHandler handler = new ConfigureHandler(Configure);
            DomSqlMapBuilder builder = new DomSqlMapBuilder();
            _isqlMapper = builder.ConfigureAndWatch(filepath, handler);
        }
 
// 重设config
 protected  void Configure(object obj)
        {
            _isqlMapper = null;//(SqlMapper) obj;
        }
2。DPSSqlMapperManager负责分配mapper实例,就是工厂的作用
public class DPSSqlMapperManager
    {
             // Use static hashtable to save muti mapper
        private static Hashtable _sqlMapperTable = Hashtable.Synchronized(new Hashtable());
     
        /// <summary>
        /// Return a mapper according to sqlmap config name
        /// </summary>
        /// <returns>An instance of ORM class</returns>
        public  static IDPSSqlMapper CreateMapper(string file)
        {
            if (!_sqlMapperTable.Contains(file))
            {     
                // Create a new mapper
                _sqlMapperTable[file] = DPSSqlMapperImpl.CreateMapper(file);              
            }
            // Get exist mapper from mapper poll
            return (IDPSSqlMapper)_sqlMapperTable[file];
        }
        /// <summary>
        /// Return a mapper according to sqlmap.config file
        /// </summary>
        /// <returns>An instance of ORM class</returns>
        public static IDPSSqlMapper CreateMapper()
        {
            return CreateMapper(DPSSqlMapperConst.DEFAULT_SQLMAP_CONFIG_PATH); 
        }
              
    }

3。DPSSqlMapperImpl 中用singleton patten 实例化新的mapper
4。如果想要加密connection,可以自己写算法,在构造函数里面实现。当然,为了维护方便,还要写个小工具解密(需要的话)

PS:用static的好处就是快,但是测试的时候遇到过一个问题。就是在debug的时候出现异常后,终止立刻重新执行的话,有时候会出现空引用。就是说在static hashtable会找到,但是这个对象已经被销毁了。我觉得应该是因为debug的时候static是声明在appdomain上,ide重新执行的时候,有时候没有释放,所以才出现上述问题,真实系统应该不会出现这个问题,不知道这样理解对不对。