2012-04-24 3 views
0
class LogUtil<T> : ILogUtility 
{ 
    log4net.ILog log; 

    public LogUtil() 
    { 
     log = log4net.LogManager.GetLogger(typeof(T).FullName); 
    } 

    public void Log(LogType logtype, string message) 
    { 
     Console.WriteLine("logging coming from class {0} - message {1} " , typeof(T).FullName, message); 
    } 
} 

public class Logger 
{ 
    ILogUtility _logutility; 

    public Logger(ILogUtility logutility) 
    { 
     _logutility = logutility; 
    } 


    public void Log(LogType logtype, string message) 
    { 
     _logutility.Log(logtype, message); 
    } 


} 

Мне нужно, чтобы функциональность была гибкой и у вас есть возможность удалить класс LogUtil в будущем и использовать что-то еще.лучший способ написать класс обертки для освобождения связи

Так я пишу LoggerUtility класс обертку следующим образом:

class LoggerUtility<T> 
{ 
    public Logger logger 
    { 
     get 
     { 

      LogUtil<T> logutil = new LogUtil<T>(); 

      Logger log = new Logger(logutil); 

      return log; 
     } 
    } 
} 

Мой код клиента следующим образом:

public class TestCode 
{ 
    public void test() 
    { 

     new LoggerUtility<TestCode>().logger.Log(LogType.Info, "hello world"); 

    } 

} 

Я кодирования Logger свойство, которое не может быть чистым.

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

new LoggerUtility<TestCode>().logger.Log(LogType.Info, "hello world"); 

Есть ли лучший способ написать код клиента? Я хочу иметь свободное соединение с LogUtil и не использовать его прямо в моем клиентском коде.

Пожалуйста, дайте мне знать.

Благодаря

+0

Почему не просто код против 'интерфейса ILogUtil' реализуемого' 'LogUtil ? – Lee

+0

как это сделать? –

+0

У клиентов клиента зависит от 'ILogUtil' вместо' LogUtil 'i.e.' ILogUtil logger = GetLogger(); 'вместо' LogUtil = GetLogger(); '. Затем вы можете изменить реализацию, если вам нужно. В качестве альтернативы вы можете просто напрямую зависеть от log4net (или интерфейса '' ILog'), поскольку вам вряд ли понадобится изменить вашу работу с регистратором. – Lee

ответ

2

Ответ на этот вопрос содержится в комментариях, правильные (клиенты должны зависеть от интерфейса ILogUtil, а не конкретной реализации напрямую). Есть множество других проблем также:

  • Вы инстанцирование нового экземпляра класса LoggerUtility<T>иLogger класса каждый раз при входе в сообщении. Возможно, что-то здесь должно быть статичным? В чем смысл дополнительного слоя (LoggerUtility)?

  • Ваше использование дженериков (LoggerUtility<T>) не имеет особого смысла, поскольку вы не обязаны просто вводить T, и вы не используете эту информацию.

В действительности, написание собственного фасада лесозаготовки - это усилия, которые другие люди уже потратили - просто используйте существующую реализацию. Я мог бы ручаться за log4net и NLog, но если вы предпочитаете гибкость для правильного фасада в Castle.Services.Logging, у которого есть адаптеры для предыдущих упомянутых реализаций (и вы могли бы написать свой собственный!).

Больше информации здесь: Is there a logging facade for the .NET world?

0

Зависит от сложности вы хотите, чтобы ваш каротаж обертка для себя?

Существует несколько уровней регистрации, информация и исключения являются нормой.

Ответы, связанные с использованием интерфейсов, на 100% правильные, но есть также директор DRY (Do not Repeat Yourself).

Если вы обнаружите, что ваш код выглядит очень повторяющимся, как и мой, то, возможно, помимо использования таких стандартов, как Injection и Interfaces, также реализуйте универсальную оболочку вокруг обработки ошибок.

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

public static output ExecuteBlockwithLogging<output, input, config>(ExeBlock<output, input, config> exeBlock, input InputForExeBlock, ILoggingBlock logger) 
    { 

     exeBlock.Execute(InputForExeBlock); 

     if ((exeBlock.logEntries != null) && (exeBlock.logEntries.Length > 0)) 
     { 
      logger.Execute(exeBlock.logEntries); 
     } 


     if ((exeBlock.exceptions != null) && (exeBlock.exceptions.Length > 0)) 
     { 
      foreach (var e in exeBlock.exceptions) 
      { 

       var dictionaryData = new Dictionary<string, string>(); 
       if (e.Data.Count > 0) 
       { 
        foreach (DictionaryEntry d in e.Data) 
        { 
         dictionaryData.Add(d.Key.ToString(), d.Value.ToString()); 
        } 
       } 

       var messages = e.FromHierarchy(ex => ex.InnerException).Select(ex => ex.Message); 


       LoggingEntry LE = new LoggingEntry 
       { 
        description = e.Message, 
        exceptionMessage = String.Join(Environment.NewLine, messages), 
        source = exeBlock.GetType().Name, 
        data = dictionaryData 
       }; 

       logger.Execute(new LoggingEntry[] { LE }); 
      } 
      return default(output); 
     } 

     return exeBlock.Result; 
    } 
Смежные вопросы