2013-03-01 2 views
0

В настоящее время у меня есть класс, написанный на C#, который выполняет некоторые простые операции регистрации ошибок. Он широко использовался во всем моем проекте.Использовать шаблон Singleton для класса регистрации ошибок?

class LogError 
{ 
    //constructor 
    public LogError() { } 

    //public methods 
    public void saveToTextFile() { } 

    //other similar methods... 
} 

Но, это не кажется, хороший дизайн этого класса, так как каждый раз, когда я должен создать экземпляр класса LogError перед тем saveToTextFile() метод может быть использован.

Так что я думаю о перепроектировании этого класса. Будет ли это хорошим примером применения шаблона Singleton? А как же это сделать вместо статического класса? Какие-либо предложения? Благодарю.

+0

Вы также можете иметь статические методы в нестатическом классе. –

+0

что вы проект? Веб-приложение или настольное приложение? –

+0

это настольное приложение с winform C#. – woodykiddy

ответ

1

Проблема с Singleton является то, что это трудно используйте разные правила ведения журнала. Затем вы хотите ввести «Отправить письмо вместо записи в текстовый файл». Это в основном то же самое, если у вас есть

new LogError().DoSomething(); 

или

LogError.Instance.DoSomething(); 

для выполнения и/или реализации самого LogError класса, за исключением.

Если вы хотите добавить гибкость, вам лучше использовать Dependency Injection (что делает ваш код более четким, чем с Singleton, кроме того) или Dependency Lookup (который находится где-то посередине).

+0

+1 для инъекций по методу описания. Чтобы добавить это для всех, кто интересуется, вы можете ввести интерфейс, который позже будет намного легче протестировать (потому что вы можете издеваться над ним). Или, если на то пошло, обменивайте всю реализацию, пока контракт интерфейса все еще существует. – Default

0

Да сделать это синглтон, а также Потокобезопасная

0

Если вы используете, любой контейнер (Autofac, Unity и т.д.), то вы можете использовать контейнер.

Singleton может быть нарушена (с помощью отражения так быть информированным)

один из реализации будет (это не требуется явное блокирование)

public class MySingleton 
{ 
    private static readonly MySingleton _singtonInstance = new MySingleton(); 
    private MySingleton() 
    { 

    } 

    public static MySingleton SingtonInstance 
    { 
     get { return _singtonInstance; } 
    } 
} 
1

Я бы посмотрел Apache log4net. Тебе не о чем беспокоиться. Вы можете настроить его для входа в несколько целей из вашего файла конфигурации (или кода). Шаблон сообщения журнала полностью настраивается. Вы можете фильтровать и маршрутизировать различные уровни журналов (debug/info/warning/error). Это действительно не стоит изобретать колесо здесь.

+0

Вам все равно придется создавать журнал «ILog log ..» в каждом классе. Хотя, я согласен с вами. Давайте использовать хорошо протестированные и обычно используемые фреймворки, а не создавать собственные. (И на стороне заметки, ему, вероятно, придется беспокоиться о чем-то * :)) – Default

+0

Эй, если разработчик никогда не преувеличивает, что-то не так ...;) –

0

Вы можете использовать интерфейс в качестве системного журнала фасада, как

interface ILoggerFacade{ 
    void Error(Exception e); 
    void Warning(Exception e); 
    .... 
} 

после этого вам нужно сделать реализацию интерфейса

class SimpleLogger:ILoggerFacade{ 

    void Error(Exception e){//logging error}; 
    ... 
} 

и finnaly вам нужно ввести точку в свой журнал. Я обычно использую статический класс, но singleton также является вариантом.

статический образец класс:

class StaticLogger{ 

    private ILoggerFacade _logger; 
    StaticLogger(){ 
     //choose ILoggerFacade implementation 
     _logger=new SimpleLogger(); 
    } 
    public static ILoggerFacade Logger{ 
     get{ return _logger;} 
    } 
} 

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

0

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

На вашем Program.cs (внутри вашего метода Main() перед Application.Run) добавьте этот код.

Application.ThreadException += CommonExceptionHandler; 

Создать CommonExceptionHandler событие на вашем Program.cs файл, скажем, рядом с главным способом.

private static void CommonExceptionHandler(object sender, ThreadExceptionEventArgs t) 
     { 
      LogError(t.Exception); 
     } 

Создать LogError метод на вашем Program.cs

public static void LogError(Exception ex) 
     { 
      var errMsg = ex.Message; 
      errMsg += ex.InnerException != null ? ex.InnerException.Message : string.Empty; 
      //TODO: Do what you want if an error occurs 
     } 

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

Смежные вопросы