0
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 获得松耦合,我最终编写了 2 个包装类 Logger 和 LoggerUtility。所以将来,如果我必须在 ILogUtility 中添加另一个方法,我必须将该方法添加到 Logger 类,然后是 LoggerUtility。

编写 LoggerUtility 的最佳方法是什么,以便我可以编写客户端代码如下:

new LoggerUtility<TestCode>().Log(LogType.Info, "hello world");

请告诉我。

谢谢

4

2 回答 2

2

看起来您正在添加一个真正不需要的抽象级别。

如果我们从您的最终结果开始,LoggerUtility 只需要一个接口,它可以用来根据LogType参数记录事物。

你的Logger类,正如它目前所写的那样,只是ILogUtility接口周围的一个薄包装。那么为什么还要添加该层呢?为什么类不能直接Logger使用ILogUtility实例?您甚至可以更进一步,将您的接口定义为ILogUtility<T>并知道当您创建一个LoggerUtility<Foo>它将使用的记录器实例将基于 Foo 类时。

但老实说,我认为你可能只是在这里重新发明轮子。查看.NET 的通用日志记录。从长远来看,它可能会减轻您尝试做的事情并变得更有意义。

于 2012-04-24T21:48:40.963 回答
0

您不需要第二个包装器,您需要一个工厂或使用依赖注入框架来围绕 log4net 构建一个适当的包装器。

使用 Ninject,并修改你的界面,你可以做

kernel.Bind(typeof(ILogUtility<>)).To(typeof(Log4NetUtil<>);

并将其实例化为

var logger = kernel.Get<ILogUtility<MyClass>>();

记录器接口/类是:

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);
    }
}
于 2012-04-24T21:43:46.513 回答