注入没有无参数构造函数的第三方类

时间:2016-08-26 19:39:26

标签: c# asp.net interface

我创建了这个类:

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对我的类进行单元测试。但现在我不知道该怎么做。

2 个答案:

答案 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注入构造函数