У нас есть бизнес-поток, подобный этому
- Получить данные списка из базы данных
- Для каждого элемента в списке
- Преобразовать элемент в JSON
- Отправка данных третьему лицу для получения результата
- Сохранение результата в db
Send data
будет отличаться в зависимости от третьего лица, один требует использования HTTP, один требует используя FTP или gRP C вызов. Я использую интерфейс, чтобы абстрагировать отправку данных третьей стороне, и пусть API, внешний уровень, решает, какой метод он хочет использовать.
Архитектура соответствует принципу Clean Architect. У нас есть Entity, Business / Core в середине и оболочка по API и инфраструктуре.
Пример кода
In Business/Core project
// Abstract class
var items = await GetItemsAsync(args); // abstract method
foreach (var item in items)
{
var json = await ConvertItemToJsonAsync(item); // abstract method
var resultInString = await SendAsync(json); // abstract method
await SaveResultAsync(item, resultInString); // abstract method
}
// Now for child classes, they will implement those abstract methods.
// In this case, it will be
override Task<string> SendAsync(string json)
{
return _thirdparty.SendDataAsync(json);
}
interface IThirdParty
{
Task<string> SendDataAsync(string json);
}
It означает, что дочерние классы будут принимать интерфейс с именем _thirdparty, чтобы отделить данные для отправки третьему лицу. На уровне API будет легко создавать некоторые виды третьих сторон, такие как отправка по HTTP, FPT или gRP C и зарегистрировать DI или лучше фабрику для использования.
Моя забота о модульном тесте, когда вы написать модульный тест, вам нужен контекст, с контекстом, вы знаете, что такое блок для написания тестового примера / скрипта. Например, если мы создаем автомобиль, контекст - это автомобиль, которым можно управлять в принципе. Должны ли мы заботиться о том, какой тип винта колеса используется? Это от поставщиков частей по уходу за сборкой. Если мы проверяем каждую часть сборки, нам нужно заботиться о винте. Это контекст. Если, следуя вышеприведенному пути, я могу легко написать юнит-тест для каждого абстрактного метода и для всего потока, я могу создать фиктивный интерфейс для третьей стороны.
Но есть проблема для Business / Core, поскольку основной целью этого бизнеса является вызов третьей стороны, то есть контекста, остальные методы имеют дело с базой данных, которую нам не нужно проверять.
Чтобы я мог проверить поток в Business / Core, мне нужно перевести конкретный класс сторонних разработчиков из API в Business / Core, а затем проверить его как единое целое. Для этого Business / Core теперь нужно использовать классы HttpClient, gRP C для работы с третьими лицами.
Мой вопрос: должен ли бизнес заботиться о сети, если это ее бизнес? Или у нас есть лучший способ решить это?