primer pensamiento - y no he pensado en su totalidad a través de este todavía, pero parece como una posibilidad razonable:
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()
{
}
}
, entonces puede tener una clase de gestor de eventos que envuelve su lista de eventos que proporcionan un método que consulta la lista según el parámetro que pasa - por ejemplo:
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);
}
}
Esto permite una administración simplificada de ev definiciones que se pueden gestionar de forma independiente para cada 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.")
)
Y se puede acceder a los eventos utilizando el identificador significativa que ha asignado:
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);
Esto probablemente simplificar su gestión de eventos, ya no eres llamando a su eventos por números mágicos, es fácil administrar todos tus eventos en un solo lugar: tu clase de EventManager y aún puedes filtrar tu registro de eventos por los números mágicos que debes filtrar.
Nunca se usaron identificadores de eventos al iniciar sesión en el registro de eventos. Acabo de poner suficiente información sobre lo que estaba sucediendo en ese punto y la dejé explotar ... – Will
@Will - Entonces, ¿cómo se filtra el registro de eventos cuando se trata de encontrar elementos relevantes? Por ejemplo, si tengo un componente que actualmente está iniciando una sesión exhaustiva pero estoy buscando un evento específico, la única manera en que puedo filtrar es filtrando en la identificación del evento. – BobTheBuilder
@Will - la idea aquí es evaluar la frecuencia de ocurrencia de un evento en particular sin tener que cavar a través del registro elemento por elemento para encontrar los relevantes. – BobTheBuilder