Première pensée - et je ne l'ai pas entièrement réfléchi à cela encore, mais il semble comme une possibilité raisonnable:
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()
{
}
}
Vous pouvez alors une classe de gestionnaire d'événements qui enveloppe votre liste d'événements fournissant une méthode qui interroge la liste en fonction du paramètre que vous passez - par exemple:
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);
}
}
Cela permet une gestion simplifiée des ev ent définitions qui peuvent être gérées indépendamment pour chaque 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.")
)
Et vous pouvez accéder aux événements en utilisant l'identifiant significatif que vous avez attribué:
var evt = Events["ConnectingToDatabase"];
TraceSource.TraceEvent(TraceEventType.Information, evt.Id, evt.DisplayFormat, otherParams);
ou
var evt = Events[1024];
Console.WriteLine("Id: {1}{0}Code: {2}{0}DisplayFormat{3}",
Environment.NewLine, evt.Id, evt.Code, evt.DisplayFormat);
Ce serait probablement simplifier la gestion des événements, vous êtes pas appeler plus votre Evénements par numéros magiques, il est simple de gérer tous vos événements en un seul endroit - votre classe EventManager et vous pouvez toujours filtrer votre journal des événements par les nombres magiques qu'il vous oblige à filtrer.
N'utilisez jamais d'ID d'événement lors de la connexion au journal des événements. Je viens de mettre assez d'informations sur ce qui se passait à ce moment là et je l'ai laissée ripper ... – Will
@Will - Alors, comment filtrez-vous votre journal des événements lorsque vous essayez de trouver des éléments pertinents? Par exemple, si j'ai un composant qui est actuellement en train de se connecter mais que je suis après un événement spécifique, la seule façon de filtrer est de filtrer sur l'identifiant de l'événement. – BobTheBuilder
@Will - l'idée ici est d'évaluer la fréquence d'apparition d'un événement particulier sans avoir à parcourir le journal item par article pour trouver les événements pertinents. – BobTheBuilder