добавить/удалить TraceListener ко всем TraceSources

Я ищу способ добавить и удалить TraceListener для всех существующих источников трассировки.

(Я не уверен, что мой подход здесь правильный, какие еще способы я мог бы использовать? По сути, я хочу регистрировать все выходные данные трассировки в файле, который использует имя текущего проекта в качестве имени файла. Всякий раз, когда пользователь создает или повторно открывает проект, я хочу добавить журналы в правильный файл.Одновременно может быть открыт только один проект.)

Пример кода:

Я создаю несколько TraceSource в своем приложении, по одному для каждого класса

public class Class1
{
    private static readonly System.Diagnostics.TraceSource trace = 
            new System.Diagnostics.TraceSource("Class1");
}

public class Class2
{
    private static readonly System.Diagnostics.TraceSource trace = 
            new System.Diagnostics.TraceSource("Class2");
}

Теперь я хочу добавить или удалить traceListener для всех моих traceSource в Среда выполнения, например:

private System.Diagnostics.TextWriterTraceListener myListener;

private onProjectOpen()
{
    // user created a new project or opened an existing one
    myListener = new System.Diagnostics.TextWriterTraceListener("log-"+projectname+".log");
    ALL_TRACESOURCES.Add ( myListener) ; // <-- how to do this?
}

private onProjectClose()
{
    // user closed a project
    ALL_TRACESOURCES.Remove( myListener) ; // <-- how to do this?
    myListener.Flush();
    myListener.Close();
    myListener.Dispose(); // <-- not sure if all this is neccessary
}

До сих пор я не нашел способа сделать это, не делая все мои traceSource общедоступными (кажется плохой идеей) и затем перечисляя все мои классы следующим образом:

Class1.Trace.Add( myListener );
Class2.Trace.Add( myListener );
...

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

Или

Добавить все мои источники трассировки в пользовательскую глобальную коллекцию в конструкторе каждого класса (легко забыть/напутать; а глобальные переменные — это плохо)

Есть ли способ получше? В основном я ищу способ установить другого прослушивателя по умолчанию

17
задан HugoRune 14 May 2012 в 10:30
поделиться