我创建了这个类:
public class DbSchemaProvider : IDbSchemaProvider
{
private readonly IConnectionStringFactory _connectionStringFactory;
private readonly ISqlProviderNameProvider _sqlProviderNameProvider;
public DbSchemaProvider(IConnectionStringFactory connectionStringFactory, ISqlProviderNameProvider sqlProviderNameProvider)
{
_connectionStringFactory = connectionStringFactory;
_sqlProviderNameProvider = sqlProviderNameProvider;
}
public DatabaseSchema GetDbSchema(SqlConnection sqlConnection)
{
var connectionString = _connectionStringFactory.Create(sqlConnection.SqlConnectionType).Build(sqlConnection);
var sqlProvider = _sqlProviderNameProvider.GetProviderName(sqlConnection.SqlConnectionType);
var dbReader = new DatabaseReader(connectionString, sqlProvider, sqlConnection.Owner);
return dbReader.ReadAll();
}
}
这里我使用的是实现IDatabaseReader接口的第三方类DatabaseReader。我想类似于IConnectionStringFactory和ISqlProviderNameProvider使用它 - 通过将它注入我的类。但是,我不能这样做,因为IDatabaseReader只能通过构造函数接受所需的参数(connectionString,sqlProvider,sqlConnection.Owner)。如果我可以使用依赖注入,我将能够使用IDatabaseReader mock对我的类进行单元测试。但现在我不知道该怎么做。
答案 0 :(得分:1)
你可以将SELECT * FROM table WHERE name NOT LIKE 'A%'
本身包裹在DatabaseReader
中
如下所示:
interface
然后,您可以将public interface IDatabaseReaderProvider{
DatabaseReader Get(string connectionString, string sqlProviderName, SqlConnection sqlConnection);
}
注入IDatabaseReaderProvider
实现,并在'Get'方法中初始化DatabaseReader
答案 1 :(得分:0)
您可以考虑在DbSchemaProvider类之外创建DatabaseReader实例。您可以在创建DbSchemaProvider实例的类/方法中创建DatabaseReader实例,并像在ISqlProviderNameProvider中那样将IDatabaseReader注入构造函数