возможно слишком упрощенное решение:
public interface ILoggable {
string ToLogFormat();
}
Затем реализуйте этот интерфейс для любого объекта, который может быть зарегистрирован. Уровень ведения журнала теперь зависит только от интерфейса и может использоваться на любом уровне.
альтернатива - использовать вспомогательные классы для реализации ToLogFormat через перегрузку, например,
public class LogHelper {
public string ToLogFormat(DAO obj) { ... }
public string ToLogFormat(SomeOtherClass obj) { ... }
...
}
вы можете использовать один монолитный помощник по журналу (что плохо, потому что он должен ссылаться на каждую библиотеку), но лучшим решением может быть реализация помощников по журналу для каждой сборки или класса и указание имени класса помощника по журналу с пользовательский атрибут
лично я предпочитаю подход ILoggable как более гибкий; ваш пакет может иметь простую функцию, такую как:
public class Logger {
public string ToLogFormat(object obj) {
if (obj is ILoggable) {
return ((ILoggable)obj).ToLogFormat();
}
return obj.ToString();
}
}