Primo pensiero - e ho pensato che questo non del tutto ancora finito, ma sembra una possibilità ragionevole:
public class LogEvent
{
/* This is the event code you reference from your code
* so you're not working with magic numbers. It will work
* much like an enum */
public string Code;
/* This is the event id that's published to the event log
* to allow simple filtering for specific events */
public int Id;
/* This is a predefined string format that allows insertion
* of variables so you can have a descriptive text template. */
public string DisplayFormat;
/* A constructor to allow you to add items to a collection in
* a single line of code */
public LogEvent(int id, string code, string displayFormat)
{
Code = code;
Id = id;
DisplayFormat = displayFormat;
}
public LogEvent(int id, string code)
: this(id, code, null)
{
}
public LogEvent()
{
}
}
si può quindi avere una classe di event manager che avvolge l'elenco degli eventi che forniscono un metodo che interroga la lista in base al parametro si passa - per esempio:
public class EventManager
{
private List<LogEvent> _eventList;
public LogEvent this[string eventCode]
{
get
{
return _eventList.Where(i => i.Code.Equals(eventCode)).SingleOrDefault();
}
}
public LogEvent this[int id]
{
get
{
return _eventList.Where(i => i.Id.Equals(id)).SingleOrDefault();
}
}
public void AddRange(params LogEvent[] logEvents)
{
Array.ForEach(logEvents, AddEvent);
}
public void Add(int id, string code)
{
AddEvent(new LogEvent(id, code));
}
public void Add(int id, string code, string displayFormat)
{
AddEvent(new LogEvent(id, code, displayFormat));
}
public void Add(LogEvent logEvent)
{
_events.Add(logEvent);
}
public void Remove(int id)
{
_eventList.Remove(_eventList.Where(i => i.id.Equals(id)).SingleOrDefault());
}
public void Remove(string code)
{
_eventList.Remove(_eventList.Where(i => i.Code.Equals(code)).SingleOrDefault());
}
public void Remove(LogEvent logEvent)
{
_eventList.Remove(logEvent);
}
}
Questo permette una gestione semplificata di ev definizioni ent che possono essere gestite indipendentemente per ogni TraceSource.
var Events = new EventManager();
Events.AddRange(
new LogEvent(1, "BuildingCommandObject", "Building command object from {0}."),
new LogEvent(2, "CommandObjectBuilt", "Command object built successfully."),
new LogEvent(3, "ConnectingToDatabase", "Connecting to {0}."),
new LogEvent(4, "ExecutingCommand", "Executing command against database {0}".),
new LogEvent(5, "CommandExecuted", "Command executed succesfully."),
new LogEvent(6, "DisconnectingFromDatabase", "Disconnecting from {0}."),
new LogEvent(7, "Disconnected", "Connection terminated.")
)
E si può accedere agli eventi utilizzando l'identificatore di significato che è stato assegnato:
var evt = Events["ConnectingToDatabase"];
TraceSource.TraceEvent(TraceEventType.Information, evt.Id, evt.DisplayFormat, otherParams);
o
var evt = Events[1024];
Console.WriteLine("Id: {1}{0}Code: {2}{0}DisplayFormat{3}",
Environment.NewLine, evt.Id, evt.Code, evt.DisplayFormat);
questo probabilmente semplificare la gestione degli eventi, non si è più chiamare il tuo sei eventi per numeri magici, è semplice gestire tutti i tuoi eventi in un unico posto: la tua classe EventManager e puoi ancora filtrare il registro degli eventi per i numeri magici che richiede di filtrare.
Non utilizzato mai ID evento quando si accede al registro eventi. Ho appena inserito abbastanza informazioni su ciò che stava accadendo a quel punto e le ho lasciato copiare ... – Will
@Will - Quindi, come si filtra il registro degli eventi quando si cerca di trovare gli articoli rilevanti? Ad esempio, se ho un componente che sta registrando in modo verboso, ma sto cercando un evento specifico, l'unico modo in cui posso filtrare è il filtro sull'ID evento. – BobTheBuilder
@Will - l'idea qui è di valutare la frequenza di occorrenza di un particolare evento senza dover scavare nel registro articolo per articolo per trovare quelli rilevanti. – BobTheBuilder