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>
{
Logger logger;
public LoggerUtility()
{
LogUtil<T> logutil = new LogUtil<T>();
logger = new Logger(logutil);
}
public void Log(LogType logtype, string message)
{
logger.Log(logtype, message);
}
}
我的客户端代码如下:
public class TestCode
{
public void test()
{
new LoggerUtility<TestCode>().Log(LogType.Info, "hello world");
}
}
为了从LogUtil获得松耦合,我最终编写了两个包装类Logger和LoggerUtility。所以在将来,如果我必须添加另一种方法 在ILogUtility中,我必须将该方法添加到Logger类,然后添加LoggerUtility。
编写LoggerUtility的最佳方法是什么,以便我可以按如下方式编写客户端代码:
new LoggerUtility<TestCode>().Log(LogType.Info, "hello world");
请告诉我。
由于
答案 0 :(得分:2)
看起来你正在添加一个抽象级别,而实际上并不需要一个抽象级别。
如果我们从最终结果开始,LoggerUtility只需要有一个可用于根据LogType
参数记录内容的接口。
您当前编写的Logger
类只是ILogUtility
界面的一个薄包装器。那么为什么还要加入那层呢?为什么Logger
类不能直接使用ILogUtility
实例?您甚至可以更进一步,将接口定义为ILogUtility<T>
,并知道在创建LoggerUtility<Foo>
时,它将使用的记录器实例将基于Foo类。
但老实说,我想你可能只是在这里重新发明轮子。看看Common Logging for .NET。从长远来看,这可能会减轻你想要做的事情并使其更有意义。
答案 1 :(得分:0)
您不需要第二个包装器,您需要工厂或使用依赖注入框架来构建围绕log4net的适当包装器。
使用Ninject并修改界面,您可以
kernel.Bind(typeof(ILogUtility<>)).To(typeof(Log4NetUtil<>);
并将其实例化为
var logger = kernel.Get<ILogUtility<MyClass>>();
logger接口/类是:
public interface ILogUtility<T> where T : class
{
void Log(LogType logtype, string message);
}
public class Log4NetUtil<T> : ILogUtility<T> where T : class
{
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);
}
}