现在的位置: 首页 > 综合 > 正文

用Nhibernate连接多个数据库,两个Mysql,一个Sql。还有关于异常和错误码的讨论。包含源代码

2011年11月16日 ⁄ 综合 ⁄ 共 2603字 ⁄ 字号 评论关闭

用Nhibernate有近一年了,把最近的一个项目例子发上来,想学Nh的可以下载参考。
还包含操作Ser和Radius的方式,映射复合主键,guid主键
代码包含三个项目:
1、NhibernateService,封装了NhFactory,NHSession。可以很简单的增加其他的数据库。目前连接了两个MySql数据库,一个SqlServe
增加新的数据库:
添加一个类:简单的继承SessionFactory就可以了,如下面增加一个连接Ser的库:

    class SerSessionFactory:SessionFactory
    
{
        
public static readonly SessionFactory _sessionFactory = new SerSessionFactory();
        
protected SerSessionFactory()
            : 
base("Ser.cfg.xml")
        
{
           

        }

    }

添加配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.0">
  
<session-factory>
    
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
    
<property name="connection.connection_string">Server=203.193.42.37;initial catalog=radius;uid=**;pwd=**</property>
    
<property name="show_sql">false</property>
    
<property name="dialect">NHibernate.Dialect.MySQLDialect</property>
    
<!--<property name="use_outer_join">true</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
-->
   
    
<mapping assembly="LoginBase" />
  
</session-factory>
</hibernate-configuration>

然后就可以通过Repository操作数据库了
Repository简单的封装了NhSession,可以操作所有配置好的数据库。主要参考了Cuyahoga的实现。如果是Web项目可以参考:http://bluewater.cnblogs.com/archive/2006/05/29/412254.html

2、LoginBase 为LoginService提供类库,用NhibernateService提供的库操作Ser,Radius和一个Sqlserver。因为LoginServie要求很高的灵活性
这个项目应用了大量的配置文件。包括login.config,errMessage.config,log4net.config,ser.cfg.xml,login.cfg.xml,radius.cfg.xml
通过用序列化实现配置文件和类的转化,代码简化了很多,灵活性不如直接用XMl方式读取。总结三种配置文件的操作方式:
1,用xmlspy等工具生成xsd,再用xsd.exe生成类,最为简便
2,自己些xml和类用序列化转换
3,自己写xml,类通过xmlreader读取转换到类,最灵活。可以实现序列化不能实现的许多功能,如HashTable。见我的http://bluewater.cnblogs.com/archive/2006/05/25/408844.html
这个项目采用了第二种,通过xmlattribute的使用,可以带来些许灵活性。
异常和错误处理:
这个项目在这方面并不完善,主要是对什么时候用Exception什么时候用错误码什么时候用Is之类的检测函数还很疑惑。
用错误码:1、效率会好点,可是如过客户没有Swich一个返回码回出现许多错误。
                   2、不容易找到错误发生的原因,因为在调用过程中会隐藏调一些返回值,加上错误码本身带的信息量就少。可以增加Log
                   3、有些程序用返回码会增加很多复杂性
以前的项目几乎每个都要返回码,遇到了大量的问题。
总监也说了好多错误码的优点,还有些应用,不过我还是认为不到必须,就用异常。
这次的异常处理结构:
定义包含异常信息的类:LoginException这个类并没有继承任何.net Exception.因为有些客户端是检测不到SoapException的,分析<fault>也不方便。
定义返回值类:UserInfo继承了LoginException。继承会带来编码上的方便,虽然看起来不合理。客户端可以通过UserINfo取到错误信息和返回值,自己决定是否返回值合法。
这个项目在LoginBase中是不应该返回UserInfo的,这样做并不合理。我觉得应该在LoginService中提供UserInfo返回。
希望都说一下错误处理的方式,我感觉还是很疑惑的。很难找到一种完美的解决方式。
Is**之类的测试函数也提供了很多方便。
3、LoginService 简单的服务调用
4、LoginTest,没有什么东西,只有很少的测试用例,这个项目用的vs 自己带的单元测试,感觉比Nunit差好多。
下载地址:

http://www.cnblogs.com/files/bluewater/login.rar
代码种不合理的地方请大家指正
 

抱歉!评论已关闭.