我正在创建一个类库,其中包含我在我开发的应用程序中经常使用的所有自定义类。这个库在我的每个应用程序中编译并添加为Reference,使我能够调用库中包含的自定义类。
我的库中的自定义类包含多层继承,但最终都源于我称之为“Alpha”的基类。在那个类中,我还保存了我的连接字符串,以便它被库中的所有其他类继承。许多类都大量使用ADO与SQL数据库进行通信,因此必须为所有类提供连接字符串。
我遇到的问题是,我想要使用我的类库的每个应用程序都有自己的数据库,因此需要一个独特的连接字符串。因此,连接字符串不能包含在我的类库中,因为这意味着我使用我的类库的所有应用程序都将查找相同的SQL数据库。但是,如果我从'Alpha'类中删除连接字符串,那么类库将无法编译,因为所有使用ADO.NET的方法都在寻找该连接字符串。
它有点像鸡蛋和鸡蛋的情景。
即。我需要Alpha类中的连接字符串才能编译类库。 即连接字符串不能在类库中,因为我需要它对每个应用程序都是唯一的
我能想到的唯一解决方案是给我的类库中的每个方法使用ADO,一个参数来保存连接字符串,然后可以从应用程序代码传入。但这似乎不是克服这个问题的一种非常简洁的方式。
理想情况下,我想要的是每个应用程序中存储连接字符串的单个位置。然后我需要某种方式在我的类库中引用这个位置,即使在编写我的类库时该位置将不可用(因为它位于各个应用程序中)。
答案 0 :(得分:2)
通常连接字符串是应用程序生命周期的常量,因此您可以从实际应用程序的app.config中提取它,并要求使用您的库,客户端应用程序将此字符串传递给您的库。
所以我决定在我的库中创建一个全局帮助器类,我存储从客户端应用程序传递的连接字符串,然后我的内部libary方法使用这个全局属性来读取连接。
public static class DatabaseHelper
{
public static DbConnectionString {get;set;}
}
然后客户端应用程序在其启动时调用
DatabaseHelper.DbConnectionString = ConfigurationManager.ConnectionStrings["MyDbCon"].ConnectionString;
在我的图书馆
public DataTable CustomerTable()
{
using(SqlConnection cn = new SqlConnection(DataBaseHelper.DbConnectionString))
......
}
答案 1 :(得分:0)
感谢史蒂夫的评论(接受我的回答),我能够解决这个问题。但是我认为如果对其他人有帮助的话,我会包括我的代码改编:
在我的班级图书馆
public static class Alpha
{
public static string ConnectionString { get; set; }
public static SqlConnection DatabaseConnection()
{
SqlConnection linkToDB = new SqlConnection(ConnectionString);
return linkToDB;
}
然后在我的库中的整个类中使用linkToDB。
然后在WinForms应用程序中,我在启动登录的Load事件中设置连接字符串,如下所示:
private void LoginInForm_Load(object sender, EventArgs e)
{
Alpha.ConnectionString = @"...connection string goes here...";
}