如何改进依赖注入
本文关键字:注入 依赖 何改进 | 更新日期: 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
等。这些类中的每一个都有自己的IDatabaseConnectionStringProvider
和IDatabaseDataProvider
实现。我将通过在Ninject模块中绑定它们来告诉使用哪个实现。
这是一个正确的方法,或者可能有一个更好的解决方案?因为在此之前,我使用了很多工厂,这些工厂创建了前面提到的接口的必要实现,维护它很快就变成了一场噩梦。但现在,这似乎是更好的方法——我有一个基类,我将从中继承和绑定继承类的必要依赖项。
然而,继承的类只是空的-他们使用这个基类DatabaseDataProviderBase
实现,正因为如此,我觉得我做错了什么。建议感激。
您不需要仅仅为了完整性而派生类。你的基类看起来已经完成了。
关键在于你将如何使用这个类。你要用IDataProvider
吗?
IDataProvider consumer = new ...
如果是,那么问题可能出在更新数据提供程序上。你可以使用工厂来完成这个任务:
void Consumer(Func<IDataProvider> providerFactory)
{
IDataProvider provider = providerFactory();
...
}
通过这种方式,您只需要将提供者工厂填充到所有消费类中,并让它们使用抽象数据提供者。您不需要任何派生类,只要您能够提供一个Func<IDataProvider>
委托或其他。