C# 在一个类中多次重构SqlConnection的使用

C# 在一个类中多次重构SqlConnection的使用,c#,C#,我有一些代码,它们形成了一个以数据库为中心的类,该类执行CRUD操作。Insert()和Select()方法使用相同的连接字符串。目前,通过重复设置SqlConnection的标准位,这两种方法都是重复的 如何最好地重构它?我应该拥有SqlConnection的属性吗 谢谢我通常用两种方法中的一种来做 包含连接到数据库的静态方法和属性的类。然后我可以在我需要的任何其他类中使用它 连接到数据库的类中的SqlConnection属性。然后在需要时从控制类注入连接 到目前为止,第一个选项是最常用的

我有一些代码,它们形成了一个以数据库为中心的类,该类执行CRUD操作。Insert()和Select()方法使用相同的连接字符串。目前,通过重复设置SqlConnection的标准位,这两种方法都是重复的

如何最好地重构它?我应该拥有SqlConnection的属性吗


谢谢

我通常用两种方法中的一种来做

  • 包含连接到数据库的静态方法和属性的类。然后我可以在我需要的任何其他类中使用它

  • 连接到数据库的类中的SqlConnection属性。然后在需要时从控制类注入连接

到目前为止,第一个选项是最常用的。唯一的问题是,如果数据库服务器发生更改,我需要重新编译该类。不过,我们只有一个数据库服务器,而且它不会经常更改,所以这并不是什么大问题


第二种选择的好处是它更加灵活;如果服务器、用户或密码发生更改,只需在控制类中更新该信息即可。

这取决于您的应用程序。就我而言:不。你可能想添加一个新方法来建立连接(这甚至可能是个好主意),但是作为字段/属性的连接听起来像“我在表单的整个生命周期中打开一个连接”,这在我的世界中是邪恶的

创建一个helper方法并编写如下内容

using (var connection = CreateSqlConnection()) {
  // Do the operations here
}

将所有DB操作拉到一个类中,并将该类传递给需要它的对象。您可以通过构造函数注入来实现这一点(每个新对象都会获得一个传递给它的IDBProvider,然后用于数据库操作)

大概是这样的:

public interface IDBProvider {
   // ... list of DB operations you care about
   List<Products> GetProducts(string vendor)
}

public class SomeWorkerClass {
   private IDBProvider dbConnection;

   public SomeWorkerClass(IDBProvider dbProvider) {
      dbConnection = dbProvider;
   }

   public void SomeFunction() {
      List<Products> = dbConnection.GetProducts("test");
   } 
}
公共接口IDBProvider{
//…您关心的数据库操作列表
列出产品(字符串供应商)
}
公共类someworker类{
私有连接;
公共SomeWorkerClass(IDBProvider dbProvider){
dbConnection=dbProvider;
}
公共函数(){
List=dbConnection.GetProducts(“测试”);
} 
}

有很多框架可以为您完成这类工作,例如,但在某些情况下,您也可以轻松地启动自己的框架(升级现有代码、不需要外部框架依赖关系的组织等)。

您不必一直打开连接;只要在需要时传递连接(或连接字符串)以供使用就足够了。Michael,我就是这么说的。至少这就是我的意思,我看不出文本的含混之处?我的印象是,你认为这种联系不仅存在,而且在它的整个生命周期中都保持着开放状态。如果这不正确,我误解了你。在第二种方法中,你的意思是连接来自调用连接到db/的类的成员的类吗?是的,或者,至少,一个ConnectionString被传递到执行数据库工作的类中。这样做的想法是,您有一个“主”类来运行该节目(您的SqlConnection或ConnectionString将在这里创建和维护),而实际执行数据库工作的每个“从”类将在创建时接收该连接。这样,您只需在一个地方维护SqlConnection。