DDD и TDD пример ядра трансакции банка по основным операциям (пополнение, снятие, конвертация валют, выписка по банковскому счету).
В системе по умолчанию заведены два пользователя:
-
id 100104 баланс 10000 RUB, с возможностью держать сумму в трех разных валютах (н.п IDR и USD и EUR) одновременно
-
id 100105 баланс 300000 IDR, с возможностью держать сумму в одной валюте (IDR или USD или EUR или RUB)
Все пользователи и связанные с ними кошельки (accounts) хранятся в оперативной памяти и как следствие, теряют последние изменения после перезапуска решения.
При разработке были сделаны следующие допущения:
-
Пополнение и снятие возможно только в текущей валюте (задается ендпойнтом convert);
-
Количество конвертируемых валют задается только при создании кошелька;
-
Конвертация с одной валюты в другую происходит с сохранением эквивалента баланса;
-
Снять пользователю в долг невозможно (т.е снимать больше чем средств в кошельке).
Основные URL WEB API:
3 a. Пополнить кошелек в одной из валют
https://localhost:44368/api/v1/deposit/100104/20000
3 b. Снять деньги в одной из валют
https://localhost:44368/api/v1/withdraw/100104/4000
3 c. Перевести деньги из одной валюты в другую
https://localhost:44368/api/v1/convert/100104?targetCurrency=idr
3 d. Получить состояние своего кошелька (сумму денег в каждой из валют)
https://localhost:44368/api/v1/account/100104
Технические особенности проекта:
Многоуровневая архитектура позволяет структурировать приложения на группы подзадач.Изоляция модели предметной области без подгружаемых зависимостей соседних проектов решения;
Реализация по канонам предметно-ориентированного программирования (Domain Driven Design). Проектирование с помощью тактических шаблонов, (сущность, объект, значение, репозиторий и агрегат) с целью получения высококачественной модели, максимально точно отражающая поставленные бизнес-цели;
Разработка с цикличным рефакторингом и применением принципов объектно-ориентированного
программирования, разных паттернов и методологий SOLID;
Фокус на промышленное качество кода. Написание 45 Unit тестов, в том числе на неизменяемость классов (immutability) и выверенная проверка на равенство и порядка (equality comparison), выявляло необходимость в создании кастомых классов типа struct (Currency.cs) и коллекции ValueObjectCollection.cs;
Использование продвинутых возможностей ООП языка C# (Generics, Inheritance, Polymorphism) и фреймворка Asp.NET Core 3 (глобальный обработчик ошибок, внедрение зависимости сервисов, внедрение Swagger, подгрузка IConfigurationRoot объекта для использования в базовом файле проекта MS-TEST итд);
Ориентир на применение лучших практик сообществ по программированию решений уровня Enterprise.