数据访问 Class 设计:使 类 可测试同时还包含依赖项
Data Access Class design: making classes testable whilst also containing dependencies
我需要一些设计建议。
我有一个应用程序将从各种来源读取数据并进行检查和比较。我的意图是将数据访问(System.Data.SqlClient
等)所需的所有依赖项包含在一组数据访问 classes(SqlImporter
、JSONImporter
等)中。其他需要数据的 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 才能允许自动测试,这似乎是一个不错的权衡。 ;-)
我需要一些设计建议。
我有一个应用程序将从各种来源读取数据并进行检查和比较。我的意图是将数据访问(System.Data.SqlClient
等)所需的所有依赖项包含在一组数据访问 classes(SqlImporter
、JSONImporter
等)中。其他需要数据的 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 才能允许自动测试,这似乎是一个不错的权衡。 ;-)