实例明智的连接字符串

时间:2017-08-14 08:04:52

标签: c# connection-string desktop-application

我正在使用单例方法,其中我的C#类库接受连接字符串并将其存储在静态变量中,而变量又由不同的类用于执行特定任务。到目前为止,这个过程运行正常,但我有一种情况,即Windows使用者应用程序必须创建所述类的N个实例,并且每个实例必须同时使用不同的数据库。

显然,静态方法将不再起作用,因此我删除了静态变量。我只是想知道,除了将连接字符串从类传递给类之外,最好的方法是什么?我也尝试使用Properties.Settings.Default存储连接字符串,但每次创建新实例时它都会覆盖现有的字符串!

下面列出了我整个项目的原型(虽小):

我有类ConnectionString,其作用是接受并使连接字符串可用于命名空间中的其他类。

internal class ConnectionString
            {
                private string _connectionstring { get; set; }
                public ConnectionString(string connectionstring)
                {
                    _connectionstring = connectionstring;

                    //WHERE TO STORE THIS STRING FOR METHODS OF OTHER CLASSES TO CONSUME????

                }
            }

然后有Operations类对数据库执行某些操作。

internal class Operations
            {
                public void Operation1()
                {

                    using (var conn = new SqlConnection())
                    {
                        //Some operation
                    }
                }

                public void Operation2()
                {
                    using (var conn = new SqlConnection())
                    {
                        //Some other operation
                    }

                }

                public void Operation3()
                {
                    using (var conn = new SqlConnection())
                    {
                        //Some other operation
                    }

                }      
            }

我的Windows应用程序要使用的库所暴露的类标题为Base。这反过来将消耗上述类来执行整体任务。

public class Base
    {
        public Base(string connectionstring)
        {
            var ConnInstance = new ConnectionString(connectionstring);
            var OpInstance = new Operations();

            OpInstance.Operation1();
            OpInstance.Operation2();
            OpInstance.Operation3();

        }
    }

最后,使用者应用程序需要同时创建Base的n个实例并将连接字符串传递给它。

public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                var ins1 = new Base("Data Source=(local);Initial Catalog=DATABASE1; Integrated Security=SSPI;");
                var ins2 = new Base("Data Source=(local);Initial Catalog=DATABASE2; Integrated Security=SSPI;");
                var ins3 = new Base("Data Source=(local);Initial Catalog=DATABASE3; Integrated Security=SSPI;");
                var ins4 = new Base("Data Source=(local);Initial Catalog=DATABASE4; Integrated Security=SSPI;");
                var ins5 = new Base("Data Source=(local);Initial Catalog=DATABASE5; Integrated Security=SSPI;");

            }
        }

提前 提前获取任何帮助。

1 个答案:

答案 0 :(得分:1)

您的数据库访问层与关联的“操作”不应该知道UI /表单问题。类似地,UI表单不应该实现连接字符串或数据库连接缓存。

我建议你需要一个负责连接字符串缓存的中间连接工厂类,以及一个可以在特定UI表单的连接请求之间进行仲裁的工厂。然后,您只需要从表单实例中设计工厂类的访问权限。

我想知道你是否在app逻辑和数据库连接创建之间创建了太多间接。数据库连接最重要的设计目标是它们与本地范围一起使用很短,即遵循许多使用(var db = new Connection)配置示例。 .Net运行时通常会维护超出直接控制的数据库连接缓存,因此创建数据库连接并不昂贵,但在多分钟持续时间内租用到特定表单实例的成本很高。

Azure DocumentDb API改变了有关数据库连接创建的传统观念,我上面的答案假设提问者正在使用类SQL数据库。