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);
}
}
}