我已經創建並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 –