包装类太多了

时间:2012-04-24 21:34:26

标签: c# generics log4net

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");

请告诉我。

由于

2 个答案:

答案 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);
    }
}