数据访问 Class 设计:使 类 可测试同时还包含依赖项

Data Access Class design: making classes testable whilst also containing dependencies

我需要一些设计建议。

我有一个应用程序将从各种来源读取数据并进行检查和比较。我的意图是将数据访问(System.Data.SqlClient 等)所需的所有依赖项包含在一组数据访问 classes(SqlImporterJSONImporter 等)中。其他需要数据的 classes 将只使用这些 classes 来完成工作。也许他们会传递连接字符串或其他信息。

但是,我需要对这些数据访问 class 进行单元测试。为了使它们可测试,我使我的数据访问 classes 依赖于 abstractions/interfaces,然后传入具体实现以允许我从单元测试中传入 Mock 对象,类似于

结果是这样的:

using System.Data.SqlClient;

public class SqlImport {
   private IDbConnection conn;

   public SqlImport(IDbConnection conn){
      this.conn = conn;
   }

}

我的问题是,所有使用这些数据访问的 classes classes 现在还需要依赖数据访问依赖项 (System.Data.SqlClient)。这是否在某种程度上违背了拥有这些 classes 的目的?我的意思是,它有利于凝聚力,但是...

我现在有一个 class 这样的:

using System.Data.SqlClient;
using Importers;

public class Mapping {

   public Mapping (){
   }

   public void LoadMappingFromDatabase(string connString){
      SqlImport import = new SqlImport(new SqlConnection(connString));
      // Do Stuff including using import to query db
   }
}

这样的设计好吗?或者我最好直接查询 LoadMappingFromDatabase() 中的数据库,因为所需的依赖项已经在 class?

你应该更进一步使用依赖注入:

using System.Data.SqlClient;
using Importers;

public class Mapping {

   public Mapping (){
   }

   public void LoadMappingFromDatabase(SqlImport import){

      // Do Stuff including using import to query db
   }
}

或者如果您通过构造函数注入 SqlImport 会更好:

using System.Data.SqlClient;
using Importers;

public class Mapping {
   private SqlImport import;

   public Mapping (SqlImport import){
      this.import = import
   }

   public void LoadMappingFromDatabase(){

      // Do Stuff including using import to query db
   }
}

你的设计很好。必须在代码中包含 using System.Data.SqlClient; header 才能允许自动测试,这似乎是一个不错的权衡。 ;-)