tmp*_*dev 2 javascript design-patterns dependency-injection redux redux-saga
如何在redux-sagas中使用DI。我有以下传奇
export function* loadUsers() {
// Want to use something like userService.loadUsers()
}
Run Code Online (Sandbox Code Playgroud)
如上面的代码所示,我如何将userService注入到传奇中,理想情况下,我想要这样的东西
export function* loadUsers(userService) {
userService.loadUsers()
}
Run Code Online (Sandbox Code Playgroud)
谢谢
如何在redux-sagas中使用DI?
您可以使用Redux saga API 来做到这一点,您可以访问getContext
和setContext
方法,这些方法和方法可以管理sagas中的上下文。让我们看看它是如何工作的!
致电时,createSagaMiddleware
您可以传递上下文。稍后我们将看到如何在您的环境中获得您的背景信息
这是在redux-saga中注入上下文的方法:
import { createUserService } from "...";
import createSagaMiddleware from "redux-saga";
const userService = createUserService(...);
const sagaMiddleware = createSagaMiddleware({
context: {
userService
}
});
sagaMiddleware.run(rootSaga);
Run Code Online (Sandbox Code Playgroud)
您可以getContext
从redux-saga / effects导入,然后getContext
使用所需上下文的键进行调用。因此,您会遇到userService
这种情况。
import { getContext } from "redux-saga/effects";
export function* loadUsersSagas(action) {
const userService = yield getContext("userService");
const users = yield userService.loadUsers();
...
}
Run Code Online (Sandbox Code Playgroud)
我们如何使用redux-saga测试上下文 您可以使用redux-saga-test-plan。该库的目标是测试我们的sagas。
我们要做什么?
随着provide
我们给[[getContext("userService"), { loadUsers }]]
这对嘲笑的背景下userService
。
通过getContext
我们测试,我们是否在这里的上下文中找到了正确的项目:userService
import { getContext } from "redux-saga-test-plan/matchers";
describe("Load users", () => {
it("should load mocked users", () => {
const loadUsers = () => Promise.resolve([johnDoe]);
const action = createAction(...);
return expectSaga(loadUsersSagas, action)
.provide([[getContext("userService"), { loadUsers }]])
.getContext("userService")
.call(...)
.put(...)
.run();
});
});
Run Code Online (Sandbox Code Playgroud)
希望我的回答对您有所帮助
export function* loadUsers(userService) {
userService.loadUsers()
}
Run Code Online (Sandbox Code Playgroud)
别处:
export default function* rootSaga(userService) {
yield all([
...,
...,
loadUsers(userService)
]);
}
Run Code Online (Sandbox Code Playgroud)
进而:
import { createUserService } from "...";
import createSagaMiddleware from "redux-saga";
const userService = createUserService(...);
const sagaMiddleware = createSagaMiddleware();
sagaMiddleware.run(
rootSaga,
userService
)
Run Code Online (Sandbox Code Playgroud)