В настоящее время я создаю приложение React/Redux для учащегося, и я не могу оборачивать голову тем, как делать инъекции зависимостей для служб.
Более конкретно: у меня есть BluetoothService
(который абстрагирует стороннюю библиотеку) для сканирования и подключения к другим устройствам через bluetooth. Эта услуга используется создателями действия, что-то вроде этого:
deviceActionCreators.js
const bluetoothService = require('./blueToothService')
function addDevice(device) {
return { type: 'ADD_DEVICE', device }
}
function startDeviceScan() {
return function (dispatch) {
// The Service invokes the given callback for each found device
bluetoothService.startDeviceSearch((device) => {
dispatch(addDevice(device));
});
}
}
module.exports = { addDevice, startDeviceScan };
(я использую thunk-middleware)
Моя проблема, однако, заключается в следующем: как внедрить саму службу в action-creator?
Я не хочу, чтобы это жестко закодированное require
(или import
в ES6), поскольку я не думаю, что это хороший образец - помимо того, что тестирование было намного сложнее. Я также хочу иметь возможность использовать макет службы при тестировании приложения на моей рабочей станции (у которого нет bluetooth), поэтому в зависимости от среды я хочу, чтобы другая служба с тем же интерфейсом вводилась внутри моего создателя действия. Это просто невозможно при использовании статического импорта.
Я уже пробовал сделать bluetoothService параметром для самого метода (startDeviceScan(bluetoothService){}
) - эффективно сделать этот метод чистым - но это просто перемещает проблему в контейнеры с помощью действия. Каждый контейнер должен был бы узнать о службе и затем реализовать ее инъекцию (например, через реквизит).
Плюс, когда я хочу использовать действие из другого действия, я снова получаю ту же проблему.
Цель: Я хочу принять решение о времени загрузки, которое можно использовать в моем приложении. Есть ли хороший способ или передовая практика для этого?