В целом логичное решение. Но я бы немного доработал.
В классе записи корзины (CartItem) добавляем поле "storage" (или типа того). Если 'local' - товар из текущей БД магазина, для поставщиков добавляем какой-то идентификатор. Выборку должен осуществлять, с учетом storage, наш репозиторий/менеджер/etc.
Во время добавления в корзину, я бы не добавлял запись в БД. Исходя из нашего "storage" можно дергнуть товар у поставщика. Но не совсем эффективно делать каждый раз запрос. Поэтому результаты запросов к api поставщиков кэшируем (файл-кэш, редис, мемкэш и т.д.). А при оформлении заказа, уже нужно инсертить товар внешнего поставщика. Причем можно пересмотреть структуру таблицы "Товары заказа", как-то так:
storage, order_id, product_id, quantity, price_unit...