我们正在使用NHibernate 3.2。
我希望能够从特定的ISession记录SQL查询。这可能吗?
或者,如果不可能,我可以将记录器设置为特定的ISessionFactory吗?然后我可以从这个特定的工厂创建这个ISession。
从我看到的,设置记录器,你必须做这样的事情:
<appSettings>
<add key="nhibernate-logger" value="NH3SQLLogger.LoggerFactory, NH3SQLLogger" />
</appSettings>
然而,这将使所有工厂的设置全局化。
我能做那样的事吗:
var config = new Configuration();
config.Configure();
config.SetProperty("nhibernate-logger",
"NH3SQLLogger.LoggerFactory, NH3SQLLogger");
_sessionFactory = config.BuildSessionFactory();
那会有用吗?或者还有另一种方式吗?
答案 0 :(得分:4)
不,您只能全局指定记录器。做你想做的事情会相当复杂。
你需要:
以下是一些可以帮助您入门的代码:
public class LoggerFactory : ILoggerFactory
{
#region Implementation of ILoggerFactory
/// <summary>
/// Returns the logger for a given key name
/// </summary>
/// <param name="keyName">Key or class name</param>
/// <returns>Logger</returns>
public IInternalLogger LoggerFor( string keyName )
{
if ( string.IsNullOrWhiteSpace( keyName ) )
return new NoLoggingInternalLogger();
switch ( keyName )
{
case "NHibernate.SQL":
return new SqlLogger(); // Create this class to capture the SQL
case "NHibernate.Impl.SessionImpl":
return new SessionLogger(); // Create this class to capture ISession-related stuff
default:
return new NoLoggingInternalLogger();
}
}
/// <summary>
/// Returns the logger for a given type
/// </summary>
/// <param name="type">Class name</param>
/// <returns>Logger</returns>
public IInternalLogger LoggerFor( Type type )
{
return LoggerFor( type.FullName );
}
#endregion Implementation of ILoggerFactory
}