Архитектура Onion - это, по сути, n-уровневая архитектура, использующая внедрение зависимостей.Например, рассмотрим приложение, которое берет несколько чисел, добавляет их и отображает результат.
N многоуровневое:
Уровень доступа к данным:
public class SqlNumbersGetter
{
public List<int> GetNumbers() => ...
}
Уровень бизнес-логики:
public class Summer
{
public int GetSum() => new SqlNumbersGetter().GetNumbers().Sum();
}
Уровень графического интерфейса:
public class ConsoleDisplayer
{
public void Display() => Console.WriteLine( new Summer().GetSum());
}
Архитектура лука очень похожа, но теперь мы используем интерфейсы и внедрение зависимостей:
Уровень доступа к данным:
public interface INumbersGetter
{
List<int> GetNumbers();
}
public class SqlNumbersGetter : INumbersGetter
{
public List<int> GetNumbers() => ...
}
Уровень бизнес-логики:
public interface ISummer
{
int GetSum(INumbersGetter numberGetter);
}
public class Summer : ISummer
{
public int GetSum(INumbersGetter numberGetter) => numberGetter.GetNumbers().Sum();
}
Уровень графического интерфейса:
public interface IDisplayer
{
public void Display(ISummer summer, INumbersGetter numberGetter)
}
public class ConsoleDisplayer : IDisplayer
{
public void Display(ISummer summer, INumbersGetter numberGetter) => Console.WriteLine(summer.GetSum(numberGetter));
}
Тогда ваше приложение будет создавать экземпляры всех экземпляров интерфейсов и связывать их все
public void Main()
{
new ConsoleDisplayer().Display(new Summer(), new SqlNumbersGetter());
}