C # - Глобальный программный объект - PullRequest
4 голосов
/ 09 февраля 2010

Сценарий

У меня есть нестатический класс, который обволакивает Log4Net. Это действительно удобно, поскольку оно связано с другим моим приложением, которое отображает журналы различных процессов, которые происходят в различных программах, которые я пишу (чтобы я мог видеть, где происходят ошибки, сбой пакетных процессов и т. Д.)

Проблема

Это все хорошо, но если я хочу записать весь процесс, я должен сделать ряд вещей:

  1. Создание объекта Logging.
  2. Скажите это, чтобы начать.
  3. Журнал вещей.
  4. Скажите, чтобы это прекратилось.

Это означает, что если процесс запускается за пределами класса, мне приходится возиться с передачей объекта Logging, что вызывает боль и выглядит грязно.

Вопрос

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

..... Это может быть пустой тратой времени, но мне нравятся мнения.

Ответы [ 3 ]

6 голосов
/ 09 февраля 2010

Почему вы полагаете, что сделать "это" статичным не вариант? Я подозреваю, что вы путаете идеи со статическим классом и статической переменной , которая поддерживает ссылку на экземпляр нестатического класса.

public class Foo
{
    // Instantiate here, or somewhere else
    private static LogWrapper logWrapper = new LogWrapper(...); 
    public static LogWrapper LogWrapper { get { return logWrapper; } }
}

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

Если вы делаете по синглтон-маршруту, вы можете прочитать мою статью о реализации синглтона в C # .

5 голосов
/ 09 февраля 2010

Звучит так, будто вы хотите синглтон .

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

4 голосов
/ 09 февраля 2010

Вместо того чтобы идти по статическому или одиночному пути, вы можете исследовать, используя Внедрение зависимостей (DI) с IoC Container framework .Это обеспечит возможность проверки ваших классов и отделит их от класса ведения журнала.

Контейнер IoC будет обеспечивать управление временем жизни для вас;указав время жизни контейнера, вы можете смоделировать Singleton без каких-либо недостатков.

Кривая обучения есть, но она того стоит;У DI есть много других преимуществ.

EDIT: хитрость заключается в том, чтобы избежать ловушки Service Locator. У Марка Симанна есть несколько хороших статей на эту тему (и выходит книга).

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