我创建了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
实现,因此,我觉得我做错了。建议表示赞赏。
答案 0 :(得分:0)
为了完整起见,您不需要派生类。您的基类看起来已经完整。
关键在于你要消费这门课程的方式。你只是想使用IDataProvider
吗?
IDataProvider consumer = new ...
如果是这样,那么问题可能在于新增数据提供者。您可以为此目的使用工厂并完成它:
void Consumer(Func<IDataProvider> providerFactory)
{
IDataProvider provider = providerFactory();
...
}
通过这种方式,您只需将提供程序工厂填充到所有使用的类中,并让它们使用抽象数据提供程序。只要您能够提供一个Func<IDataProvider>
代表或另一个代表,您就不需要任何派生类。