Шаблон Provider — это надежный шаблон проектирования программного обеспечения, который абстрагирует основные детали реализации, предоставляя стандартный интерфейс для доступа к ресурсу или службе. Этот шаблон обеспечивает различные преимущества, такие как повышенная модульность, гибкость, удобство сопровождения и тестирования, что делает его популярным выбором среди многих разработчиков программного обеспечения.

В этой статье мы подробно рассмотрим шаблон Provider, в том числе способы управления конфигурациями для определения того, какой провайдер будет использоваться в приложении.

Определение интерфейса поставщика

Первым шагом в использовании шаблона Provider является создание интерфейса, который будет служить образцом для всех провайдеров. Интерфейс должен указывать общие методы и свойства, необходимые для доступа к ресурсу или сервису.

Рассмотрим следующий код C#, определяющий интерфейс IDatabaseProvider для доступа к базе данных:

public interface IDatabaseProvider
{
    void Connect();
    void Disconnect();
    DataTable GetData(string query);
    void ExecuteCommand(string query);
}

Интерфейс IDatabaseProvider определяет четыре метода: подключение, отключение, получение данных и выполнение команды. Эти методы обеспечивают общий интерфейс для доступа к базе данных, независимо от базовых систем баз данных.

Создание поставщиков бетона

После того, как вы определили интерфейс, вы можете создавать конкретные реализации для каждого провайдера, который вы хотите поддерживать. Конкретные реализации должны обеспечивать конкретные реализации методов интерфейса.

Рассмотрим следующий код, определяющий классы SqlServerProvider и MongoDbProvider для доступа к базам данных SQL Server и MongoDB соответственно:

public class SqlServerProvider : IDatabaseProvider
{
    private SqlConnection _connection;
    public void Connect()
    {
        _connection = new SqlConnection("Data Source=(SOMETHING FUN);Initial Catalog=TestDB;Integrated Security=True");
        _connection.Open();
    }
    public void Disconnect()
    {
        _connection.Close();
    }
    public DataTable GetData(string query)
    {
        using (var adapter = new SqlDataAdapter(query, _connection))
        {
            var data = new DataTable();
            adapter.Fill(data);
            return data;
        }
    }
    public void ExecuteCommand(string query)
    {
        using (var command = new SqlCommand(query, _connection))
        {
            command.ExecuteNonQuery();
        }
    }
}

public class MongoDbProvider : IDatabaseProvider
{
    private MongoClient _client;
    private IMongoDatabase _database;
    public void Connect()
    {
        _client = new MongoClient("mongodb://localhost:27017");
        _database = _client.GetDatabase("TestDB");
    }
    public void Disconnect()
    {
        _client = null;
        _database = null;
    }
    public DataTable GetData(string query)
    {
        throw new NotImplementedException();
    }
    public void ExecuteCommand(string query)
    {
        throw new NotImplementedException();
    }
}

В этом примере мы определили две конкретные реализации интерфейса IDatabaseProvider: SqlServerProvider и MongoDbProvider.

Управление конфигурацией

Последним шагом в реализации шаблона Provider является управление конфигурациями, чтобы программа знала, какой провайдер использовать. Конфигурациями можно управлять различными способами, в том числе с помощью файлов конфигурации, аргументов командной строки и программно.

Файл конфигурации, такой как файл XML, который указывает тип используемого поставщика, является распространенным подходом. В качестве примера рассмотрим следующий файл конфигурации:

<configuration>
  <appSettings>
    <add key="ProviderType" value="SqlServerProvider"/>
  </appSettings>
</configuration>

В этом примере ключ ProviderType в разделе appSettings указывает, что следует использовать SqlServerProvider. Затем вы можете использовать пространство имен System.Configuration в C#, чтобы прочитать файл конфигурации и определить, какой поставщик использовать, как показано в следующем коде:

string providerType = ConfigurationManager.AppSettings["ProviderType"];
IDatabaseProvider provider = null;
switch (providerType)
{
    case "SqlServerProvider":
        provider = new SqlServerProvider();
        break;
    case "MongoDbProvider":
        provider = new MongoDbProvider();
        break;
    default:
        throw new Exception("Invalid provider type");
}

Для переменной providerType в этом коде установлено значение ключа ProviderType в файле конфигурации. В зависимости от значения providerType оператор switch используется для определения экземпляра поставщика.

Заключение

Шаблон Provider — это мощный шаблон проектирования программного обеспечения, который абстрагирует основные детали реализации, предоставляя общий интерфейс для доступа к ресурсу или службе. Этот шаблон обеспечивает различные преимущества, такие как повышенная модульность, гибкость, удобство сопровождения и тестирования, что делает его популярным выбором среди многих разработчиков программного обеспечения.

Шаблон Provider можно использовать для предоставления гибкого и модульного решения для доступа к ресурсам или службам в вашем приложении путем определения интерфейса и создания конкретных реализаций.