刚开始用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重新执行的时候,有时候没有释放,所以才出现上述问题,真实系统应该不会出现这个问题,不知道这样理解对不对。
相关文章
- 提升用户体验舒适度的核心设计原则
- OB运维 | tenant--删除租户的流程设计
- Alluxio跨集群同步机制的设计与实现
- OLAP MPP分布式关系型数据库的双活容灾系统的设计
- SpringMVC 基于MVC设计理念的优秀WEB框架
- SpringMVC 基于MVC设计理念的优秀WEB框架
- 【人工智能AI】《NoSQL 企业级基础入门与进阶实战》全书目录:我想使用 Open AI 写一本技术书籍,这是它给我设计的这本书的目录……
- Java学习笔记38:通过Spring Bean 注入static变量,来设计一套适合测试,开发,生产环境的配置项
- 【实战场景】如何设计一个分布式环境下全局唯一的信号器
- Spartacus 使用 Command 设计模式之后对以前 Connector 实现的重用