【转载】ESFramewor使用技巧(2)-- 在插件中使用NHibernate

ESFramewor使用技巧(2)-- 在插件中使用NHibernate

    我们来讨论一下这种情景,你采用基于ESFramework的4层架构进行应用开发,你分析用户的需求,并将其分类整理为几大块,考虑每一块使用一个功能插件来完成。在这几个插件中,有个插件需要访问某个数据库,并且只有这个插件需要访问这个数据库,根据插件的“自治”性质,你不想将本插件中的数据访问“上升蔓延”到应用程序(FS),而是让它“仅仅”在本插件中,这样,无论是对FS还是插件都是有好处的--FS自己不需要访问数据库(日志记录除外),插件“自治”、而且插件之间相互独立,整个系统的结构是非常清晰简单的。

    好了,我们决定在那个需要数据访问的插件中使用NHibernate来实现数据层,但是问题来了--当我们为应用程序添加一个默认的App.Config配置文件时,在应用程序启动的时候NHibernate会自动去解析这个文件的相关配置,而与应用程序不一样的是,我们也可以为插件添加一个App.Config配置文件,但是FS在加载这个插件的时候,NHibernate不会去触碰这个插件对应的App.Config,这样NHibernate就无法自动完成配置。所以,我们必须手动的解决这个问题。
    幸好,NHibernate.Cfg.Configuration的SetProperties()方法可以允许我们将配置内容添加到NHibernate中。既然,插件的App.Config不起作用,所以干脆我们用一个自定义的配置文件好了,其中加入Nhibernate配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<ESFrameworke>
    
<DataBaseType>Oracle</DataBaseType>
  
</ESFrameworke>

  
<nhibernate>
    
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
    
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.OracleClientDriver" />
    
<add key="hibernate.connection.connection_string" value="user id=jjaj;data source=ORCL;password=gsaj" />
    
<add key="hibernate.connection.isolation" value="ReadCommitted"/>
    
<add key="hibernate.dialect" value="NHibernate.Dialect.Oracle9Dialect" />
  
</nhibernate>
</configuration>

    配置文件添加之后,我们需要自己手动解析它,使用XPath可以非常容易获取配置文件中的Nhibernate配置部分:

        private static IDictionary GetNHibernageCfgs()
        {                
            
string xPath = string.Format("/configuration/nhibernate/add") ;

            XmlNodeList list 
= XmlDoc.SelectNodes(xPath) ;
            IDictionary dic 
= new Hashtable() ;
            
foreach(XmlNode node in list)
            {
                dic.Add(node.Attributes.Item(
0).InnerText ,node.Attributes.Item(1).InnerText) ;
            }

            
return dic ;            
        }

    当插件被加载的时候的时候,插件读取这个配置并初始化NHibernate的SessionFactory。但是如何切入插件加载的时刻了?你一定还记得,插件IAddin接口中的OnLoading方法--就是它了,在其中加入类似下面的代码:

                IDictionary dic   = GetNHibernageCfgs() ;
                Configuration config 
= new Configuration();
                config.SetProperties(dic) ;                        
                config 
=  config.AddAssembly("BusinessManagerAddin") ;
                ISessionFactory factory  
= config.BuildSessionFactory();    

    本文解决的只是一个简单的在Dll(插件也是Dll)中进行NHibernate配置的问题,但是本文更是为了说明一种思想,那就是,在最小的范围内解决问题(如果可以的话),而不是将问题蔓延到更大的范围。上面所说的插件中的NHibernate配置、初始化完全可以在FS中进行,但是如果这样做,不仅使得FS难于理解(因为FS根本不会使用这个配置的SessionFactory),而且FS还需要将SessionFactory引用通过某种方式传递到插件中,这违反插件“自治”原则,使得FS不再单纯,而且与插件的关系也将日趋复杂。

附录(2006.06.07):如何使用CodeSmith协助NHibernate实体类与.hbm.xml文件自动生成
    今天重装机后,重装了CodeSmith,结果忘记了如何让CodeSmith协助NHibernate,摸索了一会才搞定,现记录下来作以后参考。
(1)CodeSmith使用 V2.5
(2)将NHibernateTemplate整个文件夹放到C:\Program Files\CodeSmith\v2.5\Samples下。
(3)提供对Oracle的支持。用VS2003打开OracleNativeSchemaProvider项目,项目需要引用SchemaExplorer.dll,可在C:\Program Files\CodeSmith\v2.5下找到该文件。重新编译后,将编译生成的SchemaExplorer.OracleNativeSchemaProvider.dll和SchemaExplorer.OracleNativeSchemaProvider.dll.config文件拷贝C:\Program Files\CodeSmith\v2.5下,重新打开CodeSmith可。
(4)NHibernate配置示例:

    <configSections>
         
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />            
    
</configSections>     
    <nhibernate>
        
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
        
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.OracleClientDriver" />
        
<add key="hibernate.connection.connection_string" value="user id=XTGL;data source=ORCL;password=GSGL" />
        
<add key="hibernate.connection.isolation" value="ReadCommitted"/>
        
<add key="hibernate.dialect" value="NHibernate.Dialect.Oracle9Dialect" />
    
</nhibernate>

(5)使用SessionQuicker操作NHibernate数据层。
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在ashx页面获取Session值(未将对象引用设置到对象的实例) (转)

如何在ashx页面获取Session值(未将对象引用设置到对象的实例) 分类&#xff1a; .Net学习笔记 Session 2011-11-30 10:25 902人阅读 评论(1) 收藏 举报在一般事务处理页面&#xff0c;可以轻松的得到 Request,Response对象&#xff0c;从而进行相应的操作&#xff0c;如下&am…

java字符串从后截取_java 字符串截取的几种方式(转)

众所周知,java提供了很多字符串截取的方式。下面就来看看大致有几种。 1.split()+正则表达式来进行截取。 将正则传入split()。返回的是一个字符串数组类型。不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时。 String str = "abc,12,3yy98,0"; Strin…

REST 深度进阶

最近团队人数在扩大&#xff0c;才发现&#xff0c;REST 这个出来很多年头的东西&#xff0c;居然还有人用不好。说起来&#xff0c;REST 出现已经很久了。从早期的三层架构&#xff0c;到现在的多层、微服务&#xff0c;核心内容之一就是 API --- 从非常简单的 API&#xff0c…

绝不翻车珍珠奶茶做法

1 如何在家自制珍珠奶茶▼2 儿子&#xff0c;妈妈给你烤小饼干哦▼3 放假太久了连自己哪个班都忘了▼4 想问下&#xff0c;鸟是在哪都能起窝吗&#xff1f;▼5 不到万不得已&#xff0c;绝不去做▼6 这个店名太童年阴影了▼7 小鸡做错了什么&#xff1f;▼你点的每个赞&…

margin三个值

http://www.cnblogs.com/wangkongming/p/3204734.html margin标记可以带一个、二个、三个、四个参数&#xff0c;各有不同的含义。 margin: 20px;&#xff08;上、下、左、右各20px。&#xff09;margin: 20px 40px;&#xff08;上、下20px&#xff1b;左、右40px。&#xff09…

循环控制for

<?php/***燕十八 公益PHP培训课堂地址:YY频道88354001 学习社区:www.zixue.it **/ /***for(初始条件1;判断条件2;4:钱减少) {执行语句3; }***/for($i10; $i >1; $i--) {echo $i,<br />; }/** 扩展一下for循环,同时循环两个数 打印 5 1 4 2 3 3 2 4 1 5 **/f…

常用JS代码大全

事件源对象 event.srcElement.tagName event.srcElement.type捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey事件返回值 event.returnValue鼠标位置 event.x event.y窗体活…

施一公:“中国式科研”误国误民!表面上一片繁荣,实则深藏危机

全世界只有3.14 % 的人关注了爆炸吧知识论文和科技实力是两回事在全国政协十三届一次会议上&#xff0c;中国科学院院士、清华大学原副校长施一公曾说道&#xff1a;“我以前曾经预测&#xff0c;中国会在2020年论文数超过美国&#xff0c;没想到我们提前完成了。”但面对这项数…

正确使用和理解C#中的闭包

定义 我们把在Lambda表达式(或匿名方法)中所引用的外部变量称为捕获变量。而捕获变量的表达式就称为闭包。捕获变量 捕获的变量会在真正调用委托时“赋值”&#xff0c;而不是在捕获时“赋值”&#xff0c;即总是使用捕获变量的最新的值。如下代码所示&#xff0c;调用委托时&a…

java merge css_一句命令快速合并 JS、CSS

在项目开发环境下&#xff0c;我们会把 JS 代码尽可能模块化&#xff0c;方便管理和修改&#xff0c;这就避免不了会出现一个项目自身 JS 文件数量达到 10 个或者更多。而项目上线后&#xff0c;会要求将所有 JS 文件合并为 1 个或者几个&#xff0c;手动的操作虽然也不是问题&…

tomcat对于web.xml的security-constraint使用的处理机制

知识点 web.xml中<security-constraint> 的子元素 <http-method> 是可选的&#xff0c;如果没有 <http-method> 元素&#xff0c;这表示将禁止所有 HTTP 方法访问相应的资源。子元素 <auth-constraint> 需要和 <login-config> 相配合使用&#x…

重磅公开!36个高考数学破题大招

前段时间&#xff0c;超模君发了关于极值点偏移问题的总结资料&#xff0c;朋友们都觉得内容整合得十分详细。同时&#xff0c;也有不少很多朋友留言说希望有其他高考数学常考问题的解题总结。确实&#xff0c;毕竟高考涉及的内容非常多&#xff0c;比如说参数范围问题、数列求…

Linux服务器数据备份

2019独角兽企业重金招聘Python工程师标准>>> 服务器上的数据是如此重要&#xff0c;以至于我们定期要对其进行备份&#xff01;这里讲一下mysql的备份和使用rsync同步服务器上的文件&#xff0c;从而实现多台linux服务器之间的文件的备份。 一 Mysql备份 mysql的备份…

Serilog 日志框架如何自动删除超过 N 天的日志 ?

咨询区 JohnB&#xff1a;我的程序使用的日志框架是 Serilog&#xff0c;我是按天分割日志文件的&#xff0c;由于每日文件都比较大&#xff0c;我经常手工删除&#xff0c;但这样做很傻&#xff0c;请问日志框架有没有自动帮我删除 N 天之间的日志呢&#xff1f;回答区 someth…

linux进程通讯-纯文本文件

三)强制性加锁的实现1)对文件加锁有两种方式:劝告性锁和强制性锁.2)劝告性锁工作时,每个进程都要对文件进行读或写之前调用lockf对文件加锁,如果一个进程忘记调用lockf,那么锁协议将会被忽视3)强制性锁工作时,它将使任何一个想要访问已被加锁的文件的进程都堵塞在读或写队列上.…

java 数组长度 可变_java基础之集合长度可变的实现原理

首先我们要明白java中的集合Collection,List,ArrayList之间的关系:ArrayList是具体的实现类,实现了List接口List是接口,继承了Collection接口List继承了Collection接口 但是List是可以重复的并且有序的集合 Collection是不可重复且无序的这里我们先讲一下List集合:List接口不…

与毒”共舞30年!清华美女研究生为何放弃高薪,选择特招入伍?背后的原因令人泪崩......

全世界只有3.14 % 的人关注了爆炸吧知识从武汉新冠疫情爆发到如今&#xff0c;陈薇没有一天休息。短短半年间&#xff0c;54岁的她头发从黑到白&#xff0c;也哭了好几次。刚去武汉-现在陈薇的母亲也在电视上看到了女儿的变化&#xff1a;“她变老了&#xff0c;都有白头发了。…

Windows7 IIS7.5 HTTP Error 503 The service is unavailable 另类解决方案

这篇文章是在你看了别的解决方案仍然解决不了之后才有用。 所以再未用别的解决方案之前&#xff0c;用了该解决方案依然无效的话&#xff0c;请自己看着办。 原创&#xff1a; .net2.0和.net3.5的应用程序池请在开始菜单打开VS2005或者VS2008的目录下的Visual Studio Tools文件…

总是想得太简单?试试我的方法

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「213」篇原创敬上大家好&#xff0c;我是Z哥。你是不是有时候遇到一些问题&#xff0c;脑子会很蒙&#xff0c;没有任何头绪&#xff1f;但是觉得身边的那些高手们…

Centos-启动network报错RTNETLINK answers: File exists解决方法

背景&#xff1a;今天在Vcenter上&#xff0c;用模板克隆了一个虚拟机&#xff0c;启动之后&#xff0c;网卡启动不了&#xff0c;报错如下&#xff1a;RTNETLINK answers: File exists说明&#xff1a; 环境 Centos6.6_X64 &#xff1b; 网卡两个原因&#xff1a; 由于用模板…