使用不同程序集的相同应用程序 - Singleton无法按预期工作

时间:2016-06-15 05:39:15

标签: c# .net winforms singleton

我有一个复杂的Winforms应用程序,我必须重构。我在这个应用程序中使用的Singleton-Class存在很大问题。它没有做我认为它应该做的事情(仅在Release-Build中)。

我有一个Program.cs(Proj1.proj),它是主要的切入点。

    static class Program
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        [STAThread]
        static void Main(string[] args)
        {
            try
            {
              XmlConfigurator.Configure();
              log.Debug("Logging enabled");
              File.WriteAllText("test1.txt", "Test");
              DBConnection.Instance.GetConnectionString();
              log.Debug("GetConnectionString called");
              DBConnection.Instance.GetDatabasename();
              log.Debug("GetDatabasename called");
              Application.Run(new Mainform());
            }
            catch (Exception ex)
            {
             //...
            }
        }
    }

这是DBConnection.cs(Proj2.proj)

public class DBConnection
{
    private static readonly ILog log = LogManager.GetLogger(typeof(DBConnection));

    private static DBConnection instance;

    private string connectionString;
    private string databaseName;

    private DBConnection()
    {
        log.Debug("DBConnection ctor");
        this.connectionString = "example";
        this.databaseName = "example2";
    }

    public static DBConnection Instance
    {
        get
        {
            if (instance == null)
            {
                log.Debug("Instance was null");
                File.WriteAllText("test2.txt", "Instance was null");
                instance = new DBConnection();
            }
            log.Debug("Return instance");
            return instance;
        }
    }

    public string GetConnectionString()
    {
        return this.connectionString;
    }

    public string GetDatabasename()
    {
        return this.databaseName;
    }
}

我在Release Build中的Winform应用程序中观察到以下内容:

  • 日志条目“实例为空”是从不写在 日志文件
  • 写入“返回实例”,表明“实例为空”应该在日志文件中
  • 日志条目“DBConnection ctor”不止一次写入
  • File.WriteAllText在DBConnection.cs中不起作用(不创建文件或写入/无异常)但在Programm.cs中工作

在Debug Build中

  • 写入所有预期的日志条目,并且只创建一个实例

什么可能导致这种行为?为什么它在Debug中有效但在Release中无效?他为什么两次打电话给构造函数?尽管日志记录正在运行,为什么没有写入一些日志条目。为什么File.WriteAllText不起作用?

我没有想法,我找不到问题的原因。显然,项目中必须有一个设置可能会导致这种情况......因为如果你在新项目中重建上面显示的例子它将会起作用......

0 个答案:

没有答案