我正在使用单例方法,其中我的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;");
}
}
提前 提前获取任何帮助。
答案 0 :(得分:1)
您的数据库访问层与关联的“操作”不应该知道UI /表单问题。类似地,UI表单不应该实现连接字符串或数据库连接缓存。
我建议你需要一个负责连接字符串缓存的中间连接工厂类,以及一个可以在特定UI表单的连接请求之间进行仲裁的工厂。然后,您只需要从表单实例中设计工厂类的访问权限。
我想知道你是否在app逻辑和数据库连接创建之间创建了太多间接。数据库连接最重要的设计目标是它们与本地范围一起使用很短,即遵循许多使用(var db = new Connection)配置示例。 .Net运行时通常会维护超出直接控制的数据库连接缓存,因此创建数据库连接并不昂贵,但在多分钟持续时间内租用到特定表单实例的成本很高。
Azure DocumentDb API改变了有关数据库连接创建的传统观念,我上面的答案假设提问者正在使用类SQL数据库。