2016-09-06 54 views
0

我已經創建並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模塊來告訴要使用哪個實現。

這是一個正確的方式去或者有更好的解決方案嗎?因爲在那之前我曾經使用過很多工廠,這些工廠創建了前面提到的接口的必要實現,並且很快成爲維護它的噩夢。但現在,這似乎是更好的方法 - 我有一個基類,從中我將繼承和綁定繼承類的必要依賴關係。

但是,繼承類只是空的 - 他們正在使用這個基類的實現,因此,我覺得我做錯了什麼。建議感激。

回答

0

爲了完整起見,您不需要派生類。你的基類看起來已經完整。

重點在於你將如何消耗課程。你只是要使用IDataProvider

IDataProvider consumer = new ... 

如果是這樣,那麼問題可能在於新的數據提供者。您可以使用一個工廠用於該目的,用它做:

void Consumer(Func<IDataProvider> providerFactory) 
{ 
    IDataProvider provider = providerFactory(); 
    ... 
} 

這樣,你只需要填寫供應商工廠,所有的消費類和讓他們用抽象的數據提供者。只要您能夠提供一個Func<IDataProvider>代表或其他代表,您就不需要任何派生類。

+0

我想通過構造函數注入將'IDataProvider'注入到消費者中。但是,如果我不會有派生類,並且不會在ninject模塊中指定具體綁定,那麼base class將如何知道使用了哪個'IDatabaseConnectionStringProvider'實現? –

+0

但連接字符串提供程序是數據提供程序的構造函數參數。消費者不必知道它。 Ninject支持更細粒度的設置。您可以參考他們的文檔獲取詳細信息:https://github.com/ninject/Ninject/wiki/Contextual-Binding –