Загрузка данных


using System;

namespace OrderProcessingSystem
{
    // 1. Модель данных
    public record Order(int Id, string CustomerEmail);

    // 2. Абстракции (Интерфейсы)
    public interface IDatabase
    {
        void SaveOrder(Order order);
    }

    public interface IMailSender
    {
        void SendConfirmation(string email, string message);
    }

    // 3. Конкретные реализации баз данных
    public class MySqlDatabase : IDatabase
    {
        public void SaveOrder(Order order)
        {
            Console.WriteLine($"Сохранение заказа {order.Id} в MySQL...");
        }
    }

    public class PostgresDatabase : IDatabase
    {
        public void SaveOrder(Order order)
        {
            Console.WriteLine($"Сохранение заказа {order.Id} в PostgreSQL...");
        }
    }

    // 4. Конкретные реализации отправки почты
    public class SmtpMailSender : IMailSender
    {
        public void SendConfirmation(string email, string message)
        {
            Console.WriteLine($"Отправка email на {email} через SMTP: {message}");
        }
    }

    public class MockMailSender : IMailSender
    {
        public void SendConfirmation(string email, string message)
        {
            Console.WriteLine($"[MOCK] Симуляция отправки email на {email}: {message}");
        }
    }

    // 5. Высокоуровневый модуль (зависит только от абстракций)
    public class OrderProcessor
    {
        private readonly IDatabase _db;
        private readonly IMailSender _mailer;

        // Внедрение зависимостей (Dependency Injection) через конструктор
        public OrderProcessor(IDatabase db, IMailSender mailer)
        {
            _db = db;
            _mailer = mailer;
        }

        public void ProcessOrder(Order order)
        {
            Console.WriteLine($"Обработка заказа {order.Id}...");
            
            _db.SaveOrder(order);
            _mailer.SendConfirmation(order.CustomerEmail, "Ваш заказ принят.");
        }
    }

    // 6. Демонстрация гибкости (Точка входа)
    class Program
    {
        static void Main()
        {
            var order = new Order(101, "client@example.com");

            // Использование MySQL и SMTP (как было изначально)
            Console.WriteLine("--- Оригинальная конфигурация ---");
            var mySqlProcessor = new OrderProcessor(new MySqlDatabase(), new SmtpMailSender());
            mySqlProcessor.ProcessOrder(order);

            Console.WriteLine("\n--- Альтернативная конфигурация ---");
            // Подменяем зависимости на Postgres и MockMailSender БЕЗ изменения кода OrderProcessor
            var postgresProcessor = new OrderProcessor(new PostgresDatabase(), new MockMailSender());
            postgresProcessor.ProcessOrder(order);
        }
    }
}