У меня есть библиотека уровня доступа к данным, которую я хотел бы сделать «переносной». Причина, по которой мне нравится переносить, - это то, что я хочу работать с SQL Azure & Azure File Storage (например, данные + PDF-отчеты), а также Sql Server 2008R2 и хранилище файловой системы на конкретном сервере.Контейнер для инъекций зависимостей
На основе спецификации предполагается, что система будет работать с последующей реализацией (sql + файловое хранилище), а при встрече с определенным порогом масштабируемости мы планируем перейти на Azure.
Класс доступа к данным, который я использую, реализует интерфейс IDataProvider (который я построил) и определяет методы, которые должны иметь конкретные реализации доступа к данным. Потребляя уровень доступа к данным осуществляется через прохождение интерфейс IDataProvider и вызова методов на него, например:
public Interface IDataProvider
{
public bool DoSomething();
}
public class AzureDataProvider : IDataProvider
{
private string ConnectionString;
public AzureDataProvider(string connectionString)
{
this.ConnectionString = connectionString;
}
public AzureDataProvider():this(
ConfigurationManager.ConnectionString["conn"].ConnectionString)
{
}
public bool DoSomething()
{
return false;
}
}
Так что теперь вопрос заключается в том, что класс потребителей, которые будут вызывать методы в интерфейсе IDataProvider должен сделать следующее:
public class DataAccessConsumer
{
public void SomeOperation()
{
AzureDataProvider azureProvider = new AzureDataProvider();
IDataProvider dataProvider = (IDataProvider)azureProvider;
bool result = dataProvider.DoSomething();
}
}
Таким образом, проблема с вышеуказанным кодом заключается в том, что клиент все еще должен знать конкретный класс AzureDataProvider. Я хочу иметь способ предоставления клиенту только интерфейса IDataProvider, не передавая строку соединения для каждого метода интерфейса или не просматривая строку соединения в каждом методе через ConfigurationManager.
Возможно ли это? Будет ли абстрактная фабрика или какой-то шаблон контейнера для инъекций зависимостей сделать трюк? Если это так, я был бы признателен за образцы кода или ссылки на образцы кода.
Какие проекты будут использовать ваш код доступа к данным? –