Примечание/Отказ от ответственности: после нескольких поисков, ближайшая вещь, которую я имею, я видел на этом посту, это сообщение на SO (Method chaining and the finishing problem), которое похоже на мой вопрос, но на самом деле не отвечает на него, но в любом случае, я надеюсь, что это не дублирующий вопрос.Обеспечение вызова для завершения цепочки методов
Что я делаю:
Я создал беглую interfaceas фасада поверх существующей базы лесозаготовительной для связки вызовов методы - так что мой синтаксис выглядит как это:
Logger.Debug().Message("Debug message!").WriteToLog();
Logger.Error().Message("An exception occured").Exception(ex).WriteToLog();
Я передаю внутренний объект из одного вызова метода на следующий объект, чтобы при последнем вызове (метод WriteToLog); сообщение записывается в файл журнала где-то.
Бит я думаю пахнет
В целях проверки (только тогда, когда приложение в режиме отладки), у меня есть свойство по классу контекста (весь объект мешка собственности), которая получает передается от вызов метода возвращаемому объекту до тех пор, пока цепь не завершится; он является логическим, а по умолчанию - false.
Это свойство оценивается в деструкторе класса контекста с помощью Debug.Assert, чтобы определить, вызывается ли окончательный метод для завершения цепочки, поэтому во время разработки могут быть отобраны ошибки регистрации. (свойство, код, который устанавливает свойство и сам деструктор, создается в контексте предпроцессорной директивы #if DEBUG, поэтому, если он построен в версии или если символ не существует, код будет не скомпилированы.)
I знаю с использованием деструктора плохо в C# 2.0 и выше и что у меня может не быть доступа к свойствам, потому что я считаю, что нет никаких гарантий относительно порядка завершения. Вот почему это происходит только при построении в режиме отладки и почему я хотел бы уйти от него.
Причины Я пытаюсь построить assertation в том, что это очень легко забыть и писать код как
Logger.Debug().Message("Debug message!");
, что означает, что ничто не регистрируется, хотя при беглом взгляде он выглядит должно.
Мой вопрос
То, что я хочу знать, - может кто-нибудь придумать другой способ проверки того, что последний метод всегда вызывается? Эти сообщения просто необходимы во время разработки, чтобы подчеркнуть разработчику, что цепочка методов еще не закончена. Я не хочу, чтобы конечные пользователи находили сообщения об ошибках, связанные с протоколированием в конечном продукте.
+1 для элегантно представил/форматированный вопрос. –
Почему у вас свободный API? что не так с помощью 'Logger.Debug (« Debug message! »);' и 'Logger.Error (« Исключение произошло », ex);'? Мне кажется, что вы делаете свой API регистрации сложнее, чем нужно ... Свободные API-интерфейсы - хорошая концепция, но они не являются серебряной пулей, не пытайтесь использовать их везде, потому что вы можете. –
@TrevorPilley Поскольку это похоже на то, что у меня есть на данный момент, и это вызывает больше проблем, чем это делает. Существуют перегрузки для форматирования строк, принятия деталей исключения или того и другого, что приводит к тому, что разработчики забывают передать аргумент строкового формата или деталь исключения, которая заканчивается созданием ошибки. Последнее, что я хочу, - это диагностический инструмент, который выдает ошибку, поэтому я хочу свободный интерфейс, чтобы я мог быть явным о том, что передается где. Это не то, что я могу поменять, но, надеюсь, может поставить фасад. – Jay