Как поделиться экземпляром класса со многими классами? - PullRequest
4 голосов
/ 22 октября 2010

У меня есть веб-сервис ac #.Когда я получаю новый запрос, я создаю экземпляр журнала.У меня есть много других экземпляров других классов для обработки запроса, и я хочу, чтобы они также регистрировались.Каков наилучший способ поделиться экземпляром журнала, не передавая его в конструкторы или свойства?

Ответы [ 7 ]

3 голосов
/ 22 октября 2010

Часто какой-то статический класс / свойство используется для совместного использования объекта без необходимости везде передавать ссылки, например:

public class Logger
{
    static Logger()
    {
        this.Instance - new Logger();
    }

    public static Logger Instance
    {
        get;
        private set;
    }

    // Other non-static members
}

Использование:

Logger.Instance.Log();

Часто это (или, по крайней мере, его вариации) называют одноэлементным шаблоном .

Существует множество вариаций вышеприведенного, например, следующие незначительные вариации встречаются чаще, чем указанные выше в каркасах логирования:

public class Logger
{
    static Logger()
    {
        this.Instance = new Logger();
    }

    public static Logger Instance
    {
        get;
        private set;
    }

    public static void Log() 
    {
        Logger.Instance.Log();
    }
}

Использование:

Logger.Log();
3 голосов
/ 10 июля 2012

Синглтон-паттерн - это анти-паттерн ; Я не могу вспомнить многих случаев, когда его следует использовать или рекомендовать, в том числе в этом случае для ведения журнала.

Как мы работаем с журналированием: Экземпляр журналирования внедряется во все классы, которым это необходимо, с помощью инжектора конструктора. Например:

public class MyClass
{
    private readonly ILogger _logger;

    public MyClass(ILogger logger)
    {
        _logger = logger;
    }

    public void DoStuff()
    {
        _logger.Trace("DoStuff called");
    }
}

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

Однако: я настоятельно рекомендую первый вариант, используя DI для построения ваших классов с использованием шаблона Composition Root . Я также рекомендую использовать каркас журналирования, такой как NLog или log4net. Это настраиваемые и простые в использовании электронные письма, средства просмотра событий, файлы и т. Д. и работают в многопоточных средах.

У нас есть собственное определение ILogger, в котором есть Trace, Warn, Info, Exception и т. Д., А затем реализован этот интерфейс с использованием NLog. Это означает, что мы можем легко изменить способ регистрации, создав новую реализацию ILogger, а затем выполнив простое обновление конфигурации DI. Это одно решение для ведения журнала, которое до сих пор работало для нас очень хорошо.

2 голосов
/ 22 октября 2010

Singleton Pattern.

То есть класс с закрытым конструктором.Вы используете открытый статический метод для создания только одного экземпляра класса и возврата объекта.

edit: также стоит отметить, что вам нужно будет поместить этот класс в его собственный проект, чтобы на него могли ссылаться всеклассы.

0 голосов
/ 22 октября 2010

Обычно это не проблема создать новый экземпляр вашего регистратора в каждом классе. Конструктор логгера Log4Net принимает тип в качестве параметра, чтобы улучшить качество журналов.

0 голосов
/ 22 октября 2010

Вы можете использовать Singleton Pattern , чтобы гарантировать, что в системе есть только один экземпляр объекта регистрации.

Передача объекта регистрации в Конструктор или как свойствона самом деле сделать ваш код проще для тестирования, в зависимости от того, как вы реализуете шаблон Singleton.Ведение журнала является одной из тех раздражающих сквозных проблем, у которых всегда есть компромиссы.

0 голосов
/ 22 октября 2010

Используйте статическое поле (я предполагаю, что C # поддерживает тезисы).Синтаксис должен быть похож на этот:

private static final Logger logger = new Logger(...);

и просто используйте это всякий раз, когда вам нужно что-то записать в классе.

0 голосов
/ 22 октября 2010

Ну, вы могли бы сделать так, чтобы ваш класс журналирования содержал статические методы, которые фактически записывают в память / сбрасывают на диск. Вы также можете посмотреть на Singleton Pattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...