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 から疎結合を得るために、Logger と LoggerUtility の 2 つのラッパー クラスを作成することになります。したがって、将来、ILogUtility に別のメソッドを追加する必要がある場合は、そのメソッドを Logger クラスに追加してから、LoggerUtility に追加する必要があります。

次のようにクライアント コードを記述できるように、LoggerUtility を記述する最良の方法は何ですか。

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

私にお知らせください。

ありがとう

4

2 に答える 2

2

本当に必要のないレベルの抽象化を追加しているようです。

最終結果から始める場合、LoggerUtility には、LogTypeパラメーターに基づいてログを記録するために使用できるインターフェイスが必要です。

あなたのLoggerクラスは、現在書かれているように、ILogUtilityインターフェースの薄いラッパーです。では、なぜそのレイヤーを追加する必要があるのでしょうか。LoggerクラスがILogUtilityインスタンスを直接使用できないのはなぜですか? さらに一歩進んで、インターフェイスを として定義し、使用するロガーのインスタンスが Foo クラスに基づくことILogUtility<T>を作成することもできます。LoggerUtility<Foo>

しかし、正直なところ、ここで車輪を再発明しているだけかもしれません. Common Logging for .NETを参照してください。それはおそらくあなたがやろうとしていることを容易にし、長期的にはより理にかなっています.

于 2012-04-24T21:48:40.963 に答える
0

2 番目のラッパーは必要ありません。ファクトリが必要か、依存性注入フレームワークを使用して 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 に答える