C# 数据访问类设计:使类可测试,同时也包含依赖项

C# 数据访问类设计:使类可测试,同时也包含依赖项,c#,oop,class-design,C#,Oop,Class Design,我需要一些设计建议 我有一个应用程序,将从各种来源读取数据,并进行检查和比较。我的意图是将数据访问所需的所有依赖项(System.data.SqlClient等)包含在一组数据访问类(SqlImporter,JSONImporter等)中。其他需要数据的类将只使用这些类来完成工作。也许它们会传递一个连接字符串或其他信息 然而,我需要对这些数据访问类进行单元测试。为了使它们可测试,我让我的数据访问类依赖于抽象/接口,然后传入具体的实现,以允许我从单元测试传入模拟对象,类似于 结果是这样的: usi

我需要一些设计建议

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

然而,我需要对这些数据访问类进行单元测试。为了使它们可测试,我让我的数据访问类依赖于抽象/接口,然后传入具体的实现,以允许我从单元测试传入模拟对象,类似于

结果是这样的:

using System.Data.SqlClient;

public class SqlImport {
   private IDbConnection conn;

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

}
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
   }
}
我的问题是,所有使用这些数据访问类的类现在也需要依赖于数据访问依赖项(
System.Data.SqlClient
)。这是否有点违背了开设这些课程的目的?我的意思是,这有利于凝聚力,但是

我现在有一门课是这样的:

using System.Data.SqlClient;

public class SqlImport {
   private IDbConnection conn;

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

}
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()
中的数据库,因为所需的依赖项已经在类中了吗?

您只需进一步执行依赖项注入:

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
   }
}

你的设计很好。必须使用System.Data.SqlClient获得
头以允许自动测试性似乎是一个不错的折衷方案。;-)

我最初的设计确实包含了这种依赖项注入,但我认为最好在LoadMappingFromDatabase()方法中定义用于加载映射的Sql查询,以便该方法能够完全控制返回值的格式。。。但是,我可以在方法中添加错误处理/检查,以验证调用类定义的查询格式?大概您认为bbestAs是什么?据我所知,您希望SqlImport将所有不同的连接包装到不同的数据源。您仍然可以从LoadMappingFromDatabase内的import属性获取这些连接,并使用它们执行特定的查询。