【发布时间】:2012-04-24 19:25:29
【问题描述】:
class LogUtil<T> : ILogUtility
{
log4net.ILog log;
public LogUtil()
{
log = log4net.LogManager.GetLogger(typeof(T).FullName);
}
public void Log(LogType logtype, string message)
{
Console.WriteLine("logging coming from class {0} - message {1} " , typeof(T).FullName, message);
}
}
public class Logger
{
ILogUtility _logutility;
public Logger(ILogUtility logutility)
{
_logutility = logutility;
}
public void Log(LogType logtype, string message)
{
_logutility.Log(logtype, message);
}
}
我需要具有灵活的功能,并且能够在将来删除 LogUtil 类并使用其他东西。
所以我编写 LoggerUtility 包装类如下:
class LoggerUtility<T>
{
public Logger logger
{
get
{
LogUtil<T> logutil = new LogUtil<T>();
Logger log = new Logger(logutil);
return log;
}
}
}
我的客户端代码如下:
public class TestCode
{
public void test()
{
new LoggerUtility<TestCode>().logger.Log(LogType.Info, "hello world");
}
}
我正在编写可能不干净的 Logger 属性。
正如您所见,以下行看起来并不干净。
new LoggerUtility<TestCode>().logger.Log(LogType.Info, "hello world");
有没有更好的方法来编写客户端代码?我想与 LogUtil 松耦合,而不是直接在我的客户端代码中使用它。
请告诉我。
谢谢
【问题讨论】:
-
为什么不针对
LogUtil<T>实现的ILogUtil接口编写代码? -
让记录器的客户端依赖
ILogUtil而不是LogUtil<T>,即ILogUtil logger = GetLogger();而不是LogUtil<T> = GetLogger();。然后,您可以根据需要更改实现。或者,您可以直接依赖 log4net(或其ILog接口),因为您不太可能需要更改记录器实现。