Я создал и интерфейс 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» в потребитель, используя инъекцию конструктора. Однако, если я не буду иметь производные классы и не укажу конкретную привязку в модуле ninject, как базовый класс будет знать, какую реализацию «IDatabaseConnectionStringProvider», например, использовать? –
Но поставщик строки подключения является аргументом конструктора поставщика данных. Потребителю это не нужно знать. Ninject поддерживает более тонкую настройку. Вы можете обратиться к своей документации за подробностями: https://github.com/ninject/Ninject/wiki/Contextual-Binding –