Архитектура портов и адаптеров направлена на создание независимого кода. Уровень домена не зависит напрямую от уровня инфраструктуры, вместо этого он зависит от порта (интерфейса), а реализация порта находится на уровне инфраструктуры, верно?
Моя структура папок будет такой:
Проект для моего пользовательского интерфейса
Проект ядра приложения, который содержит службу приложений, доменные службы и доменные модели.
Проект для портов: он содержит строго интерфейсы.
Проект инфраструктуры, и у меня там есть постоянная папка.
Механизм доставки можно переключить (с консольного приложения на веб-приложение ...), и ядро по-прежнему будет работать.
То же самое и с инфраструктурой: я мог бы однажды использовать entity framework, а затем переключиться на dapper, не вызывая изменений в ядре.
Пока все хорошо, или я что-то упустил по пути, или я упустил самое базовое понимание архитектуры?
Теперь код мудрый:
Если у меня есть консольное приложение, в котором мне нужно ввести команду, и оно создает клиента.
Класс из службы приложений, находящийся в основном проекте. Он использует внедрение зависимостей для доступа к реализации IPersistence.
public class AddNewCustomer
{
private readonly IPersistence _persistence;
public AddNewCustomer(IPersistence persistence)
{
_persistence = persistence;
}
public bool addToDb(customer customer)
{
return _persistence.add(customer);
}
}
Интерфейс в проекте порта.
public interface IPersistence
{
bool add(Customer customer);
}
Реализация в интерфейсном проекте.
public class Persistence: IPersistence
{
public bool add(customer customer)
{
//inserts into DB
}
}
Предполагается, что проект порта будет посвящен исключительно интерфейсам? Как вы структурируете (структуру папок) свой проект портов и адаптеров?