Как автоматически вызвать метод в статическом классе при запуске и закрытии приложения? - PullRequest
1 голос
/ 28 апреля 2009

Я пишу статический класс для ведения журнала, который будет использоваться в моем разработанном решении. Есть несколько компонентов, которые будут использовать его, такие как консольное приложение, приложение ASP.NET и т. Д. *

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

Есть ли способ сделать это в .NET без точного вызова методов StartLog () и FinishLog () из каждого приложения в решении? Или, возможно, другой взгляд на это целиком?

Я думал об использовании блокировок в каждом методе Log () для проверки того, был ли инициализирован класс ведения журнала, однако потенциальные издержки как по производительности, так и по сложности меня пугают.

Ответы [ 4 ]

3 голосов
/ 28 апреля 2009

Вы можете использовать инициализатор типа (например, статический конструктор) для стороны запуска вещей, которая будет автоматически вызываться при первом использовании класса.

Обнаружение выключения сложнее ... есть AppDomain.ProcessExit и AppDomain.DomainUnload, что может будет достаточно для вас ... просто подпишитесь на события и реагировать соответственно.

2 голосов
/ 28 апреля 2009

Читайте о синглетонах, у Джона Скита есть отличная статья . Используя это, вы можете убедиться, что тип создается только один раз. Посмотрите на конец, когда он говорит о производительности замков. Просто пища для размышлений.

1 голос
/ 28 апреля 2009
Шаблон

Singleton , вероятно, подойдет вам лучше всего. Статическая переменная _instance инициализируется при запуске, поэтому вызывается ее конструктор Log (), и вы можете выполнить инициализацию здесь. Поскольку он реализует IDisposable и переопределяет метод Finalize, он будет иметь метод Dispose (), который будет вызываться при выходе из приложения и удалении статической переменной экземпляра.

public class Log : IDisposable {
  private Log() {
    // Initialize logic
  }

  public LogMessage(string wah) {
    // Write
  }

  public void Dispose() {
    // Clean up
  }

  public override void Finalize() {
    Dispose();
  }

  private static Log _instance = new Log();
  public static Log Instance { get { return _instance; } }

  // You can also implement helper methods on static level if you want to keep the usage same.
  public static Message(string wah) {
    _instance.LogMessage(wah);
  }
}
0 голосов
/ 28 апреля 2009

Одноэлементный шаблон, при котором вы не каждый раз заново создаете экземпляр класса Log, но используете метод getInstance (), будет работать

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