【问题标题】:Share Single Instance of Class共享单个类实例
【发布时间】:2013-01-25 01:22:20
【问题描述】:

我正在使用一个类库,其中每个类必须共享一个记录器类的单个实例。记录器不是我的,即它是我引用的 dll。共享是必要的,因为所有消息都必须附加到在实例化记录器时创建的单个日志消息文件的末尾。

我想过在实例化后通过引用传递记录器类,但这会导致一些非常丑陋的依赖关系。

我处于紧张状态,没有太多时间进行实验。关于实现这一目标的最佳方法的任何建议?我在想一个静态类可能是答案,但我承担的任何实现都需要一些时间,而且我不想走上死胡同。

======================== 更新===================

我认为这是处理这个问题的最快和最干净的方法:

    public class Logger
{
    private static LoggerTool _loggerTool;

    public static void WriteLogMessage(string message)
    {

        if (_loggerTool == null)
        {
            // Create a new log file
            string logFileName = "LogFile-" + DateTime.Now.ToString("HHmmss");

            _loggerTool = new LoggerTool(logFileName);
        }

        _loggerTool.LogMessage(message);
    }
}

【问题讨论】:

  • 例如您使用的是什么类型的 Logger..Log4Net..?
  • 在这里寻找一些好的例子stackoverflow.com/questions/6320393/…
  • 如果你也创建了自己的 Logger,也请看这里stackoverflow.com/questions/6195084/…
  • Logger 是客户端的专有代码;我所拥有的只是一个可供参考的 dll。我必须使用它。
  • 感谢大家的建议。凌晨做点事。我今天会测试它并发布结果

标签: c# class


【解决方案1】:

创建一个静态类并实现单例模式肯定对您有用,尽管这不是最简洁的方法。由于耦合,它使得单元测试等变得更加困难。

另一种方法是使用依赖注入容器,例如 autofac。

这是一个快速教程,他们使用 DI 创建使用简单的记录器类: http://stevescodingblog.co.uk/dependency-injection-beginners-guide/

【讨论】:

  • DI 是为所有需要的人提供单一实例化的绝佳方式,但可能会涉及“枪下”生产!
【解决方案2】:

类似:

public static class LogManager
{
    private static Lazy<MyLog> logLazy = new Lazy<MyLog>(() => new MyLog());
    public static MyLog Log
    {
        get{
            return logLazy.Value;
        }
    }
}

然后

LogManager.Log.Warning("blah") 

从代码中的任何位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多