实例明智的连接字符串
我正在使用单例方法,其中我的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();
}
}
最后,消费者应用程序需要同时创建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;");
}
}
谢谢提前任何形式的帮助。
您的数据库访问层与关联的“操作”应该不需要知道UI /表单的问题。同样,UI表单不应该实现连接字符串或数据库连接缓存。
我建议你需要一个中间连接工厂类,它负责连接字符串缓存,还可以选择一个可以在来自特定UI表单的连接请求之间仲裁的工厂。然后,您只需要从表单实例工程师访问工厂类。
不知您是否在创建应用程序逻辑和数据库连接之间创建了太多的间接关系。数据库连接最重要的设计目标是它们在本地范围内短暂存在,即遵循使用(var db = new Connection)配置示例的许多方法。 .Net运行时通常会维护超出直接控制的db连接缓存,因此数据库连接创建起来并不昂贵,但在多分钟的时间内租用特定表单实例的开销很大。
Azure DocumentDb API改变了有关数据库连接创建的传统知识,上面的答案假设提问者使用的是类SQL数据库。
感谢您的及时回应。我想我已经能够实现关注的分离。我面临的更大问题是,如何在不干扰其他实例的情况下为每个实例存储连接字符串。 – Arjmand
当你在'Base'中创建该对象时,是否有任何理由不能将连接字符串传递给'Operations'?那么它会有任何连接字符串,你传入基础构造函数并做正确的事情?这感觉很明显,我敢肯定,这是不可能的原因... – Chris
克里斯,实际的程序要大得多,我刚刚指定了实际程序的原型。想象一下,我有15-20个不同的类,类似于操作类,我不想将连接字符串传递给每个类。 – Arjmand
未将连接字符串传递给这些类的原因是什么?他们需要知道要使用的连接字符串,因此您必须将* something *传递给它们以确定它们需要哪个连接 - 为什么不是连接字符串本身? – Chris