Ваш вопрос касается одной из «проблем» Enterprise Library. Конечно, это просто работает (обычно с некоторыми головными болями конфигурации), но если вы хотите что-то с некоторой структурой, это не так. Кроме того, от Microsoft нет особых указаний.
Вот что я бы сделал:
Я бы добавил фасад в блок ведения журнала, который позволит вам контролировать, как вы хотите регистрировать ваши данные. то есть, если вы не хотите, чтобы разработчики создавали свои собственные категории, попросите ваш фасад взять перечисление (вы можете пометить его как Flags, чтобы разрешить несколько категорий).
Я бы избавился от Приоритета, так как я не думаю, что он покупает слишком много, учитывая, что у вас также есть Фильтр серьезности и категории.
Вы также можете добавить перегрузки для поддержки исключений и ValidationResults (если вы используете блок приложения проверки).
Еще одна функция, которую вы можете захотеть добавить, - добавить имя класса в качестве категории для поддержки ведения журнала для определенных классов. Вы можете либо попросить разработчиков передать имя класса, либо вы можете определить его с помощью отражения. Я предпочитаю передавать его.
Так что вы можете сделать что-то вроде этого:
[Flags]
public enum EventDataTypeCategory
{
None = 0x0,
Failure = 0x1,
Error = 0x2 ,
Warning = 0x4,
Information = 0x8,
Debug = 0x10,
Trace = 0x20,
UIEvents = 0x40,
DataAccess = 0x80
}
public static void LogMessage(string message, string className, int eventId,
EventDataTypeCategory categories)
{
// Create LogEntry
LogEntry logEntry = new LogEntry(...);
// Add all categories
foreach (EventDataTypeCategory enumValue in System.Enum.GetValues(typeof(EventDataTypeCategory )))
{
if ((enumValue & categories) == enumValue )
{
logEntry.Categories.Add(enumValue.ToString());
}
}
if (className != null)
{
logEntry.Categories.Add(className);
}
...
Logger.Write(logEntry);
}
Тогда вы могли бы назвать это так:
public class MyClass
{
private static readonly string ClassName = typeof(MyClass).FullName;
public void DoSomething()
{
MyLogger.LogMessage("I'm going to DoSomething now!",
ClassName,
1001,
EventDataTypeCategory.Trace | EventDataTypeCategory.UIEvents);
}
}
Если это все еще слишком много аргументов, то вы можете иметь перегрузку, которая принимает меньше параметров и предоставляет значения по умолчанию для других значений. например если вам не нужны идентификаторы событий, по умолчанию их значение равно 0.