如何创建全局可见变量?

时间:2014-03-15 20:22:53

标签: c# .net ado.net global-variables

如何声明变量并在所有文件中使用它?例如,我有:

MySqlConnection cn = new MySqlConnection("blablabla");

我想在所有文件中使用cn而不声明它。

3 个答案:

答案 0 :(得分:12)

你的问题的直接答案是公开和静态:

public static class Session
{
    static MySqlConnection _connection;

    public static MySqlConnection Connection
    {
        get
        {
            if (_connection == null)
            {
                // instantiate _connection here
            }

            return _connection;
        }
    }
}

然后,您可以使用Session.Connection从任意位置访问它。

然而,恕我直言这是一个糟糕的设计决定。在整个应用程序的生命周期中拥有唯一的实时连接实例不会以任何方式使您受益。事实上,它实际上会让你的生活成为一个噩梦,原因有很多,比如不可预测的连接丢失,不合时宜的打开/关闭和多线程地狱。

您应该使用某种连接工厂来创建一个正确的初始化连接对象并将其返回。然后可以全局访问那个工厂方法。

public static ConnectionFactory
{
    public static MySqlConnection CreateConnection()
    {
        // create and return your MySqlConnection object
    }
}

然后,从代码中的任何位置开始:

using (var cn = ConnectionFactory.CreateConnection())
{
    // do data-related stuff
}

此处的using语句将确保您的连接实例在完成后将被妥善处理,从而使您的应用程序免于无用的开销,并使服务器免于向客户端保持开放的通道。

正如ADO.NET best practices所述:

  

高性能应用程序保持与数据源的连接   使用最短的时间,(...)

在构建数据驱动的应用程序时,请记住这一点。

答案 1 :(得分:2)

也许您可以在某些App.configWeb.config内声明连接字符串。

然后在每次需要时从那里读取connectionString。

这个例子就像这样:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="MyConnection 
    connectionString="Data Source=.;Initial Catalog=MyDB;Integrated Security=True"/>
  </connectionStrings>
</configuration> 

这里有一些关于此的信息:

http://msdn.microsoft.com/es-es/library/ms254494(v=vs.110).aspx

答案 2 :(得分:2)

使用 Singleton Pattern

    class MySqlConnection
    {
        private static MySqlConnection _Instance;
        public static MySqlConnection Instance()
        {
            return _Instance == null ? _Instance = new MySqlConnection () : _Instance;
        }
    }