如何改进依赖注入

本文关键字:注入 依赖 何改进 | 更新日期: 2023-09-27 18:05:49

我已经创建了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;
    }
}

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

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

然而,继承的类只是空的-他们使用这个基类DatabaseDataProviderBase实现,正因为如此,我觉得我做错了什么。建议感激。

如何改进依赖注入

您不需要仅仅为了完整性而派生类。你的基类看起来已经完成了。

关键在于你将如何使用这个类。你要用IDataProvider吗?

IDataProvider consumer = new ...

如果是,那么问题可能出在更新数据提供程序上。你可以使用工厂来完成这个任务:

void Consumer(Func<IDataProvider> providerFactory)
{
    IDataProvider provider = providerFactory();
    ...
}
通过这种方式,您只需要将提供者工厂填充到所有消费类中,并让它们使用抽象数据提供者。您不需要任何派生类,只要您能够提供一个Func<IDataProvider>委托或其他。