2015-02-16 3 views
2

Я просто хотел реализовать ILoggerFactory, чтобы сбрасывать только SQL-запросы в файл для целей отладки.NHibernate - Регистрация фабричной реализации пользовательского регистратора

Я использовал следующую конфигурацию, чтобы NHibernate знал о моей реализации.

var configuration = new Configuration(); 
     configuration.SetProperty("nhibernate-logger", "SQLLog.LoggerFactory, SQLLog"); 

Прежде чем внедрять все необходимые методы, я хотел убедиться, что NHibernate использует мою собственную реализацию. Поэтому я поставил точку останова в конструкторе по умолчанию LoggerFactory, чтобы убедиться, что NHibernate вызывает мою пользовательскую реализацию. К сожалению, точка останова никогда не попадает.

Может ли кто-нибудь помочь мне в настройке настраиваемого регистратора для NHibernate и как убедиться, что NHibernate использует мой зарегистрированный LoggerFactory?

Обратите внимание, что я хочу выполнить настройку на уровне кода, но не используя файлы * .config.

Обратите внимание, что у меня есть реализация NHibernate в отдельной сборке и реализации SQL-регистратора в отдельной сборке в том же решении. Но оба двоичных файла не содержат одну и ту же папку bin, где выполняется мое основное приложение.

using System; 
using NHibernate; 

namespace SQLLog 
{ 
public class LoggerFactory:ILoggerFactory 
{ 

    public LoggerFactory() 
    { 
     var mn = string.Empty; 
    } 

    public IInternalLogger LoggerFor(string keyName) 
    { 
     throw new NotImplementedException(); 
    } 

    public IInternalLogger LoggerFor(Type type) 
    { 
     throw new NotImplementedException(); 
    } 
} 
} 
+0

- DLL SQLLog, развернутый по тому же пути вызывающей программы? –

+0

Здравствуйте, Felice, Да, SQLLog находится на том же пути, что и вызывающая программа. – RSF

+0

Является ли класс класса общедоступным? Просто попробуйте угадать: разместите свой код, он может помочь –

ответ

1

Возможно, код, который вы написали, верен. Поэтому должен быть какой-то тонкий недостающий пункт. Я читал NH-код, и могу сказать, что Исключение будет выведено, если заводский класс журнала не найден или не работает и так далее. Поэтому я предлагаю сделать контрольный список следующим образом:

configuration.SetProperty("nhibernate-logger", "NotExistingClass.Logger, NotExistingAsm"); 

И проверьте, есть ли у вас исключение. Если у вас есть, конфигурация выполняется в надлежащее время, и тот факт, что вы не можете отлаживать, вызван некоторой несоосностью между исполняемым кодом и тем, который вы отлаживаете. Если исключение не возникает, вы настраиваете его до конца, или у вас есть опечатка в ключе конфигурации.

+0

Felice, Спасибо за обновление. Я проверю свою реализацию, как вы предлагали, и продолжайте обновлять сообщение с моими выводами. – RSF

0

Я проверил код NHibernate и что отсутствует является следующим ключом на web.config (configuration.SetProperty не требуется):

<add key="nhibernate-logger" value="myNamespace.LoggerFactory, myAssemblyName" /> 

Вот метод, который использует его (NHibernate.LoggerProvider)

private const string NhibernateLoggerConfKey = "nhibernate-logger"; 

    private static string GetNhibernateLoggerClass() 
    { 
     var nhibernateLogger = ConfigurationManager.AppSettings.Keys.Cast<string>().FirstOrDefault(k => NhibernateLoggerConfKey.Equals(k.ToLowerInvariant())); 
     string nhibernateLoggerClass = null; 
     if (string.IsNullOrEmpty(nhibernateLogger)) 
     { 
      // look for log4net.dll 
      string baseDir = AppDomain.CurrentDomain.BaseDirectory; 
      string relativeSearchPath = AppDomain.CurrentDomain.RelativeSearchPath; 
      string binPath = relativeSearchPath == null ? baseDir : Path.Combine(baseDir, relativeSearchPath); 
      string log4NetDllPath = binPath == null ? "log4net.dll" : Path.Combine(binPath, "log4net.dll"); 

      if (File.Exists(log4NetDllPath)) 
      { 
       nhibernateLoggerClass = typeof (Log4NetLoggerFactory).AssemblyQualifiedName; 
      } 
     } 
     else 
     { 
      nhibernateLoggerClass = ConfigurationManager.AppSettings[nhibernateLogger]; 
     } 
     return nhibernateLoggerClass; 
    } 
Смежные вопросы