1. 配置log4net.
<? xml version="1.0" encoding="utf-8" ?>
< log4net >
< appender name ="rollingFile" type ="log4net.Appender.RollingFileAppender,log4net" >
< param name ="File" value ="D:\log.txt" />
< param name ="AppendToFile" value ="false" />
< param name ="RollingStyle" value ="Date" />
< param name ="DatePattern" value ="yyyy.MM.dd" />
< param name ="StaticLogFileName" value ="true" />
< layout type ="log4net.Layout.PatternLayout,log4net" >
< param name ="ConversionPattern" value ="%d [%t] %-5p %c [%x] <%X{auth}> - %m%n" />
</ layout >
</ appender >
< root >
<!-- 如果只需要看看Sql设置INFO就够了,如果你要调试可以设置为DEBUG或ALL -->
< priority value ="INFO" />
< appender-ref ref ="rollingFile" />
</ root >
</ log4net >
a). 将上面的xml保存为log4net.cfg.xml文件,放在工程根目录下并在该文件的属性窗口中选择”始终复制“,这样在每次编译时,此文件都将被复制到工程输出目录中,该输出目录是VS搜索路径的一部分,在代码中可以访问。
b). 在程序初始化的地方使用下面一条语句,用来加载log4net.cfg.xml配置文件。
XmlConfigurator.Configure( new FileInfo( " log4net.cfg.xml " )); // 初始化log4net
c). 在类中创建一个ILog
private static readonly ILog log = LogManager.GetLogger( typeof (类名));
d). 使用log
log.Info( " MyTestInitialize " );
log.Debug( " MyTestInitialize " );
log.Warn( " MyTestInitialize " );
log.Error( " MyTestInitialize " );
最终,如果一切顺利的话,NHiberante和自己的日志都将被输出到D:\log.txt中。
2. 微软自带的测试框架。
在VS2008中,微软的测试框架不会将dll文件外的配置文件复制到Out目录中,并且测试框架的搜索目录被固定为框架的跟目录(一个很长的地址)。讲解这两个问题的办法是:
1. 解决搜索路径问题。
[AssemblyInitialize]
public static void AssemblyInitialize(TestContext context)
{
AppDomain.CurrentDomain.SetData( " APPBASE " , System.Environment.CurrentDirectory);
AppDomain.CurrentDomain.ClearPrivatePath();
// AppDomainSetup.PrivateBinPath = "";
}
将上面的代码加入到测试用例中。就可以修改当前目录为Out目录。可以将此代码放到一个基类中,所有的测试类都继承自此类。
2. 解决非dll文件无法复制的问题
解决方案根目录有个LocalTestRun.testrunconfig文件用于记录需要额外复制的文件。在VS中Solution Items文件夹下也存在此文件。双击此文件,在弹出的窗口中,选择部署,添加一些需要额外复制的文件或者目录即可。(注意:有时候,修改此文件后,VS不能立即生效,导致我经常需要重启VS,郁闷。不知道是个什么情况)。
3. NHibernate.Mapping.Attributes
NHiberante.Mapping.Attributes是nhcontrib的一部分。网址: http://sourceforge.net/projects/nhcontrib/
下面是一个简单的Attribute映射的POCO类。
[Class(Table = " BaseOrder " , NameType = typeof (Order))] //貌似NameType必选
public class Order
{
[Id(0, TypeType = typeof (Guid))] //貌似此几项都必选
[Generator(1, Class = " guid " )]
public virtual Guid Id { get ; set ; }
[Property]
public virtual string Name { get ; set ; }
[Property]
public virtual string Category { get ; set ; }
[Property]
public virtual bool Discontinued { get ; set ; }
}
那么, Attribute如何生效呢 ? 见下面的NHiberanteHelper类。
class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
public static ISessionFactory SessionFactory{
get {
if (_sessionFactory == null ){//只有刚才的Attribute定义还不够,必须将这些映射定义加入到configuration中。
System.IO.MemoryStream stream = new System.IO.MemoryStream();// Enable validation (可选)
NHibernate.Mapping.Attributes.HbmSerializer.Default.Validate = true ;
// Here, we serialize all decorated classes (but you can also do it class by class)
NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
stream, System.Reflection.Assembly.GetExecutingAssembly());
stream .Position = 0 ; // Rewind
Configuration cfg = new Configuration().Configure(); //此处使用了加载了hibernate.cfg.xml以及*.hbm.xml映射文件
// cfg.AddAssembly(typeof(Product).Assembly);
cfg.AddInputStream(stream); // Use the stream here //此处才加载了Attribute定义的映射。
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession(){
return SessionFactory.OpenSession();
}
}
从上面的代码可以看出,Attribute映射和Xml映射可以同时使用。