InversifyJS 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
InversifyJS 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
InversifyJS 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
InversifyJS 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
InversifyJS 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

InversifyJS 一个强大而轻量级的反转控件 (IoC) 容器,适用于由TypeScript编写的JavaScript和Node.js应用。它使用类构造函数去定义和注入它的依赖。InversifyJS API友好易懂,鼓励对OOP和IoC最佳实践的应用。

InversifyJS有4个主要目标:

  1. 允许JavaScript开发人员编写遵循 SOLID 原则的代码。

  2. 促进并鼓励遵守最佳的面向对象编程和依赖注入实践。

  3. 尽可能少的运行时开销。

  4. 提供艺术编程体验和生态。

使用

步骤 1:定义接口

// file interfaces.ts

export interface Warrior {
    fight(): string;
    sneak(): string;
}

export interface Weapon {
    hit(): string;
}

export interface ThrowableWeapon {
    throw(): string;
}

步骤 2:定义依赖

// file entities.ts

import { injectable, inject } from "inversify";
import "reflect-metadata";
import { Weapon, ThrowableWeapon, Warrior } from "./interfaces";
import { TYPES } from "./types";

@injectable()
class Katana implements Weapon {
    public hit() {
        return "cut!";
    }
}

@injectable()
class Shuriken implements ThrowableWeapon {
    public throw() {
        return "hit!";
    }
}

@injectable()
class Ninja implements Warrior {

    private _katana: Weapon;
    private _shuriken: ThrowableWeapon;

    public constructor(
	    @inject(TYPES.Weapon) katana: Weapon,
	    @inject(TYPES.ThrowableWeapon) shuriken: ThrowableWeapon
    ) {
        this._katana = katana;
        this._shuriken = shuriken;
    }

    public fight() { return this._katana.hit(); }
    public sneak() { return this._shuriken.throw(); }

}

export { Ninja, Katana, Shuriken };

步骤 3:创建并配置 IOC 容器

// file inversify.config.ts

import { Container } from "inversify";
import { TYPES } from "./types";
import { Warrior, Weapon, ThrowableWeapon } from "./interfaces";
import { Ninja, Katana, Shuriken } from "./entities";

const myContainer = new Container();
myContainer.bind<Warrior>(TYPES.Warrior).to(Ninja);
myContainer.bind<Weapon>(TYPES.Weapon).to(Katana);
myContainer.bind<ThrowableWeapon>(TYPES.ThrowableWeapon).to(Shuriken);

export { myContainer };

步骤4:依赖解析

import { myContainer } from "./inversify.config";
import { TYPES } from "./types";
import { Warrior } from "./interfaces";

const ninja = myContainer.get<Warrior>(TYPES.Warrior);

expect(ninja.fight()).eql("cut!"); // true
expect(ninja.sneak()).eql("hit!"); // true
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (2)

加载中
从api设计角度来讲. @injectable() 为啥搞这么长, @inject 不香吗, scala语言之父说过:手指多动一下是可耻的.
06/09 08:38
回复
举报
两个都有的,injectable表示当前对象可以被发现和被注入,inject表示注入其他对象
06/09 09:54
回复
举报
更多评论
暂无内容
发表于大前端专区
2018/06/04 11:26

InversifyJS入门

本教程基于上一篇教程 https://my.oschina.net/lilugirl2005/blog/1823618 安装 npm install inversify reflect-metadata --save 修改tsconfig.json 设置属性如下 "lib": ["es6", "dom"], "types": ["reflect-metadata"], "moduleResolution": "node", "experimentalDecorators": true, "emitDecoratorMetadata": true...

0
0
发表了博客
2018/11/07 15:41

解读 IoC 框架 InversifyJS

原文链接 InversityJS 是一个 IoC 框架。IoC(Inversion of Control) 包括依赖注入(Dependency Injection) 和依赖查询(Dependency Lookup)。 相比于类继承的方式,控制反转解耦了父类和子类的联系。 案例解析 import 'reflect-metadata' import { inject, injectable, Container } from 'inversify' const container = new Container() @injectable() class PopMusic { getName() { return '流行音乐' } } container.b...

0
0
2020/06/12 08:58

CloudBeaver 参考架构

CloudBeaver 是一个基于 Web 的云数据库管理工具,支持 PostgreSQL、MySQL、MariaDB、SQLite 和 Firebird 等数据库。 server osgi 模式,依赖dbeaver 依赖的库 依赖的库 Equinox osgi 容器 Eclipse Platform,虚拟文件系统&&插件系统 Jetty web server Java Graphql 前端通信api DBeaver 系统管理平台 一些三方数据库驱动 当前支持的数据库 pg mysql mariadb sqlite firebird server api api 地址格式:http://localhost:${Serve...

0
0
发表了博客
2018/08/28 01:17

[VueJS + Typescript] Decouple Dependencies Using IoC Containers in Vue with TypeScript and Invers...

Using Object Oriented Programming, OOP, style allows us to apply Inversion of Control, IoC, and more patterns. An IoC container helps decoupling dependencies by using a class constructor or properties to identify and inject its dependencies. This lesson will show you how can you create and use an IoC container to decouple an http client and users service dependencies in a Vue component with Typ...

0
0
发表了博客
02/03 12:07

使用 TypeScript 和依赖注入实现一个聊天机器人[每日前端夜话0x76]

使用 TypeScript 和依赖注入实现一个聊天机器人[每日前端夜话0x76] 疯狂的技术宅 前端先锋 每日前端夜话0x76 每日前端夜话,陪你聊前端。 每天晚上18:00准时推送。 正文共:3509 字 预计阅读时间: 10 分钟 翻译:疯狂的技术宅 来源:toptal 类型和可测试代码是避免错误的两种最有效方法,尤其是代码随会时间而变化。我们可以分别通过利用 TypeScript 和依赖注入(DI)将这两种技术应用于JavaScript开发。 在本 TypeScript 教程...

0
0
发表于大前端专区
2019/05/27 17:58

使用 TypeScript 和依赖注入实现一个聊天机器人[每日前端夜话0x76]

每日前端夜话0x76 每日前端夜话,陪你聊前端。 每天晚上18:00准时推送。 正文共:3509 字 预计阅读时间: 10 分钟 翻译:疯狂的技术宅 来源:toptal 类型和可测试代码是避免错误的两种最有效方法,尤其是代码随会时间而变化。我们可以分别通过利用 TypeScript 和依赖注入(DI)将这两种技术应用于JavaScript开发。 在本 TypeScript 教程中,除编译以外,我们不会直接介绍 TypeScript 的基础知识。相反,我们将会演示 TypeScript...

0
0
发表了博客
2019/04/10 10:10

Theia架构

上一篇:Theia——云端和桌面版的IDE 架构概述   本节描述了Theia的整体架构。   Theia被设计为一个可以在本地运行的桌面应用程序,也可以在浏览器和远程服务器之间工作。为了支持这两种工作方式,Theia运行在两个独立的进程中,它们被称之为前端和后端,相互之间通过WebSockets上的JSON-RPC消息或HTTP上的REST APIs来通信。对于Electron而言,前端和后端都在本地运行,而在远程上下文中,后端运行在远程服务器上。   前端...

0
0
01/08 09:14

凹凸技术揭秘 · Tide 研发平台 · 布局研发新基建

![](https://oscimg.oschina.net/oscnet/up-5badb15b79b547d9a1d5beb8f3aa7241d41.JPEG) ## 背景 随着前端技术领域的高速发展,前端开发也变得越来越复杂。业务扩张,小程序平台井喷式增加,都导致开发者肩上的负担越来越重。为了提升研发效率,减少人力浪费,我们开发了开放式跨端跨框架解决方案 [Taro](https://github.com/NervJS/taro),支持使用 React/Vue/Nerv 等框架来开发 微信 / 京东 / 百度 / 支付宝 / 字节跳动 / QQ...

0
0
发表了博客
2019/04/10 10:10

使用Theia——创建扩展包

上一篇:使用Theia——构建你自己的IDE 创建Theia扩展包   本例中,我们将添加一个菜单项“Say hello”用来显示一个通知“Hello world!”。本文将指导你完成所有必要的步骤。 Theia的架构   Theia应用程序由所谓的扩展包(extensions)构成。一个扩展包提供一组特定功能的小部件、命令和处理程序等。Theia本身提供了一些扩展包,如编辑器、终端、项目视图等。每一个扩展包都属于它们各自的npm包。   Theia定义了大量的con...

0
0
2020/08/20 07:51

【Web技术】691- 了不起的 IoC 与 DI

本文阿宝哥将从六个方面入手,全方位带你一起探索面向对象编程中 IoC(控制反转)和 DI(依赖注入) 的设计思想。阅读完本文,你将了解以下内容: IoC 是什么、IoC 能解决什么问题; IoC 与 DI 之间的关系、未使用 DI 框架和使用 DI 框架之间的区别; DI 在 AngularJS/Angular 和 NestJS 中的应用; 了解如何使用 TypeScript 实现一个 IoC 容器,并了解 装饰器、反射 的相关知识。 一、背景概述 在介绍什么是 IoC 容器之前,阿宝...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
2 评论
13 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部