using System;
using System.Collections.Generic;
namespace Codanna.Examples.Relationships
{
public class ServiceA
{
private readonly ServiceB _serviceB;
public ServiceA(ServiceB serviceB)
{
_serviceB = serviceB;
}
public string MethodA(string input)
{
Console.WriteLine("ServiceA.MethodA called");
return _serviceB.MethodB(input);
}
}
public class ServiceB
{
private readonly ServiceC _serviceC;
public ServiceB(ServiceC serviceC)
{
_serviceC = serviceC;
}
public string MethodB(string input)
{
Console.WriteLine("ServiceB.MethodB called");
return _serviceC.MethodC(input);
}
}
public class ServiceC
{
public string MethodC(string input)
{
Console.WriteLine("ServiceC.MethodC called");
return input.ToUpper();
}
}
public class LoggerService
{
public void Log(string message)
{
Console.WriteLine($"[LOG] {message}");
}
}
public class ServiceOrchestrator
{
private readonly DataService _dataService;
private readonly ValidationService _validationService;
private readonly ProcessingService _processingService;
private readonly NotificationService _notificationService;
private readonly LoggerService _logger;
public ServiceOrchestrator(
DataService dataService,
ValidationService validationService,
ProcessingService processingService,
NotificationService notificationService,
LoggerService logger)
{
_dataService = dataService;
_validationService = validationService;
_processingService = processingService;
_notificationService = notificationService;
_logger = logger;
}
public void Execute(string request)
{
_logger.Log("Starting execution");
var data = _dataService.FetchData(request);
if (!_validationService.Validate(data))
{
_logger.Log("Validation failed");
return;
}
var result = _processingService.Process(data);
_notificationService.Notify("Processing completed", result);
_logger.Log("Execution completed");
}
}
public class DataService
{
private readonly LoggerService _logger;
public DataService(LoggerService logger)
{
_logger = logger;
}
public string FetchData(string request)
{
_logger.Log("Fetching data");
ConnectToDatabase();
var data = QueryDatabase(request);
CloseConnection();
return data;
}
private void ConnectToDatabase()
{
Console.WriteLine("Connecting to database...");
}
private string QueryDatabase(string request)
{
Console.WriteLine($"Querying database for: {request}");
return $"Data for {request}";
}
private void CloseConnection()
{
Console.WriteLine("Closing database connection...");
}
}
public class ValidationService
{
private readonly LoggerService _logger;
public ValidationService(LoggerService logger)
{
_logger = logger;
}
public bool Validate(string data)
{
_logger.Log("Validating data");
return !string.IsNullOrEmpty(data);
}
}
public class ProcessingService
{
public string Process(string data)
{
data = Transform(data);
data = ApplyRules(data);
ValidateResult(data);
return data;
}
private string Transform(string data)
{
return data.ToUpper();
}
private string ApplyRules(string data)
{
return $"[PROCESSED] {data}";
}
private void ValidateResult(string data)
{
if (string.IsNullOrEmpty(data))
throw new InvalidOperationException("Processing failed");
}
}
public class NotificationService
{
public void Notify(string title, string message)
{
Console.WriteLine($"NOTIFICATION: {title} - {message}");
}
}
public interface IRepository
{
string GetById(int id);
void Save(string data);
}
public class DatabaseRepository : IRepository
{
public string GetById(int id)
{
return $"Data for ID {id}";
}
public void Save(string data)
{
Console.WriteLine($"Saving: {data}");
}
}
public class RepositoryConsumer
{
private readonly IRepository _repository;
public RepositoryConsumer(IRepository repository)
{
_repository = repository;
}
public void LoadAndSave(int id)
{
var data = _repository.GetById(id);
_repository.Save(data + " [modified]");
}
}
public class RecursiveService
{
public int Factorial(int n)
{
if (n <= 1)
return 1;
return n * Factorial(n - 1);
}
public void CountDownA(int n)
{
if (n > 0)
{
Console.WriteLine($"CountDownA: {n}");
CountDownB(n - 1);
}
}
private void CountDownB(int n)
{
if (n > 0)
{
Console.WriteLine($"CountDownB: {n}");
CountDownA(n - 1);
}
}
}
public static class MathUtils
{
public static int Add(int a, int b)
{
return a + b;
}
public static int Multiply(int a, int b)
{
return a * b;
}
}
public class Calculator
{
public int Calculate(int a, int b, int c)
{
var sum = MathUtils.Add(a, b);
return MathUtils.Multiply(sum, c);
}
}
}