
楼主目前是一个 Vue.js 和 React 都在用的前端打工人,像 Vue Composition API 和 React Hooks 这些技术真的是拯救人生啊,感觉前端的开发体验越来越像丝绸般顺滑。
另一方面呢,由于目前的项目里面有着非常复杂的数据处理逻辑,所以我们封装了很多可复用的 Service 类。但是有一点不太方便的是,必须在业务组件或者 Service 里面手动创建它们所依赖的 Service 实例。受 Angular 、Nest 以及 Spring 这些框架的启发,开始尝试在 Vue.js 和 React 应用中通过依赖注入的方式解决这个问题。
Vesselize (文档:https://vesselize.js.org)就是楼主最近业余时间写的一个 Javascript IoC 容器,目前已经在项目中正式使用。可以直接在 Vue.js 或 React 应用中,直接通过类似 useInstance('ServiceName') 的 API 来解决对服务实例的依赖。这次造轮子的过程中学到了不少新知识,分享出来希望对大家有所帮助。
下面是一段在 Vue.js 中使用 Vesselize 的示例代码:
import { ref, watchEffect } from 'vue'; import { useInstance } from '@vesselize/vue'; export default { setup() { const user = ref({}); const userService = useInstance('UserService'); watchEffect(() => { userService.getUser().then((data) => { user.value = data; }); }); return { user }; }, }; Github 代码仓库: https://github.com/vesselize
文档及使用指南: https://vesselize.js.org
项目示例:
1 Hanggi 2020-11-29 22:14:36 +08:00 直接用 Angular 就好了。 |
3 yzqtdu 2020-11-30 00:15:54 +08:00 via Android 看示例代码,和 nestjs 不同的是感觉楼主用依赖查找实现了控制反转 |
4 EPr2hh6LADQWqRVH 2020-11-30 00:27:26 +08:00 这个轮子造得没有必要, 依赖注入是要结合类写法才合适,像 ts 那样依赖注入到构造函数, 像你这样写还不如 angular.js 第一代的方式用参数名注入。 前端的最主要问题就是不会面向对象,一个连构造函数都没有的东西,强行 DI 太勉强了 |
5 9ki 2020-11-30 11:12:53 +08:00 不能通过装饰器注入意义不大,但是想实现装饰器注入就要用 TS,我现在的解决方案和楼主的差不多,都是挺别扭的,类型还不好处理,希望 JS 以后可以一个完整的解决方案吧 |
6 yuankui 2020-11-30 15:29:46 +08:00 container.get("name"); 在 typescript 返回的是 any 类型, 如果要在 typescript, 需要手动进行类型确认, 用起来不是很有自信哦. 像 spring 中,可以通过 getBean(ClassName)类自动推动实例的类型,写起代码来就很自信了. 楼主这块有什么好的解法呢? |
7 cereschen 2020-12-16 20:43:17 +08:00 对 ts 的支持是灾难 |