如何改善依赖注入?

时间:2016-09-06 18:17:45

标签: c# asp.net inheritance dependency-injection ninject

我创建了IDataProvider接口,并按照以下方式实现:

public class DatabaseDataProviderBase : IDataProvider
{
    private readonly IDatabaseConnectionStringProvider _databaseConnectionStringProvider;
    private readonly IParameterApplicator<string> _sqlParameterApplicator;
    private readonly IDatabaseDataProvider _databaseDataProvider;

    public DatabaseDataProviderBase(IDatabaseConnectionStringProvider databaseConnectionStringProvider, IParameterApplicator<string> sqlParameterApplicator, IDatabaseDataProvider databaseDataProvider)
    {
        _databaseConnectionStringProvider = databaseConnectionStringProvider;
        _sqlParameterApplicator = sqlParameterApplicator;
        _databaseDataProvider = databaseDataProvider;
    }

    public DataSet GetData(SqlResource sqlResource, List<Parameter> parameters)
    {
        var connectionString = _databaseConnectionStringProvider.Get(sqlResource.SqlConnection);
        var selectQuery = _sqlParameterApplicator.Apply(parameters, sqlResource.SelectQuery);
        var dataSet = _databaseDataProvider.Get(connectionString, selectQuery);

        return dataSet;
    }
}

现在我需要很多可以从这个类继承的类。即,NpgsqlDataProviderMsSqlDataProviderOdbcDataprovider等。这些类中的每一个都有自己的IDatabaseConnectionStringProviderIDatabaseDataProvider实现。我将通过在Ninject模块中绑定它们来告诉使用哪个实现。

这是一种正确的方法还是有更好的解决方案?因为在此之前我使用了很多工厂来创建前面提到的接口的必要实现,很快就成了维护它的噩梦。但是现在,这似乎是更好的方法 - 我有一个基类,我将继承并绑定继承类的必要依赖项。

但是,继承的类只是空的 - 它们正在使用这个基类DatabaseDataProviderBase实现,因此,我觉得我做错了。建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

为了完整起见,您不需要派生类。您的基类看起来已经完整。

关键在于你要消费这门课程的方式。你只是想使用IDataProvider吗?

IDataProvider consumer = new ...

如果是这样,那么问题可能在于新增数据提供者。您可以为此目的使用工厂并完成它:

void Consumer(Func<IDataProvider> providerFactory)
{
    IDataProvider provider = providerFactory();
    ...
}

通过这种方式,您只需将提供程序工厂填充到所有使用的类中,并让它们使用抽象数据提供程序。只要您能够提供一个Func<IDataProvider>代表或另一个代表,您就不需要任何派生类。