【问题标题】:Instance wise connection String实例连接字符串
【发布时间】:2017-08-14 16:54:09
【问题描述】:

我正在使用单例方法,其中我的 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????

                }
            }

然后是对数据库执行某些操作的操作类。

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();

        }
    }

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

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;");

            }
        }

感谢您 提前提供任何帮助。

【问题讨论】:

  • 当您在Base 中创建该对象时,是否有任何理由不能将连接字符串传递给Operations?那么它会有你传递给基本构造函数的任何连接字符串并做正确的事情吗?这感觉很明显,我敢肯定这不可能是有原因的......
  • Chris,实际程序要大得多,我刚刚指定了实际程序的原型。想象一下,我有 15 到 20 个类似于 Operations 类的不同类,我不想将连接字符串传递给这些类中的每一个。
  • 不将连接字符串传递给这些类的原因是什么?他们需要知道要使用什么连接字符串,因此您必须将 something 传递给他们以确定他们需要哪个连接 - 为什么不使用连接字符串本身?
  • 这确实是可能的,我已将这种方法作为最后的手段。我觉得每个类都需要存储连接字符串,然后将其传递给其他类,然后再传递给其他类,以此类推。

标签: c# connection-string desktop-application


【解决方案1】:

具有相关“操作”的数据库访问层不需要了解 UI/Form 问题。类似地,UI 表单不必实现连接字符串或数据库连接缓存。

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

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

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

【讨论】:

  • 感谢您的及时回复。我想我已经能够实现关注点的分离。我面临的更大问题是在不干扰其他实例的情况下存储每个实例的连接字符串的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多