我已经创建并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模块来告诉要使用哪个实现。
这是一个正确的方式去或者有更好的解决方案吗?因为在那之前我曾经使用过很多工厂,这些工厂创建了前面提到的接口的必要实现,并且很快成为维护它的噩梦。但现在,这似乎是更好的方法 - 我有一个基类,从中我将继承和绑定继承类的必要依赖关系。
但是,继承类只是空的 - 他们正在使用这个基类的实现,因此,我觉得我做错了什么。建议感激。
我想通过构造函数注入将'IDataProvider'注入到消费者中。但是,如果我不会有派生类,并且不会在ninject模块中指定具体绑定,那么base class将如何知道使用了哪个'IDatabaseConnectionStringProvider'实现? –
但连接字符串提供程序是数据提供程序的构造函数参数。消费者不必知道它。 Ninject支持更细粒度的设置。您可以参考他们的文档获取详细信息:https://github.com/ninject/Ninject/wiki/Contextual-Binding –