首页 > 其他分享 >es7 依赖注入(Dependency Injection, DI)

es7 依赖注入(Dependency Injection, DI)

时间:2023-01-11 23:22:38浏览次数:44  
标签:es7 依赖 const DI prop Dependency 模块 return 注入

ES7中的依赖注入是一种技术,用于解决模块之间的耦合性问题。它允许我们将模块之间的依赖关系抽象化,从而使它们更容易重构,测试和更新。它也可以帮助我们更好地管理应用程序的可复用模块,以提高代码的可维护性。

 

proxy 依赖注入

ES7中的依赖注入可以通过使用 JavaScript 的 Proxy 和 Reflect 对象来实现。通过使用 Proxy 对象,我们可以实现一个“装饰者”,它可以在我们调用某个模块时自动注入依赖关系。通过使用 Reflect 对象,我们可以实现一个“检查者”,它可以在我们调用某个模块时检查所需的依赖关系是否已经注入。

simple-demo

 
// 创建需要注入的依赖
const Logger = require('./logger');

// 创建注入器
const injector = (function() {
  const dependencies = {};
 
  return new Proxy({}, {
    get: (obj, prop) => {
      if(dependencies[prop]) {
        return dependencies[prop];
      }
 
      throw new Error(`Dependency ${prop} not found`);
    },
    set: (obj, prop, val) => {
      dependencies[prop] = val;
    }
  });
})();

// 使用注入器注入依赖
injector.Logger = Logger;

// 使用注入器调用模块
const Module = (function(injector) {
  // 使用 Reflect 检查所需的依赖是否已注入
  const requiredDependencies = Reflect.ownKeys(injector);
 
  return function() {
    // 使用 Proxy 自动注入依赖
    return new Proxy({}, {
      get: (target, prop) => {
        if(requiredDependencies.includes(prop)) {
          return injector[prop];
        }
 
        return target[prop];
      }
    });
  };
})(injector);

// 使用模块
const module = Module();
module.Logger.log('Hello, World!');

  


 

装饰器-依赖注入

装饰器是一种元编程技术,能够改变类和函数的行为。它有助于我们将一些重复的代码集中到一个地方,而不是在函数的多个地方进行重复定义。ES7中的装饰器可以用来实现类似于依赖注入的功能。可以创建一个装饰器,该装饰器能够将我们想要注入的依赖传递给所要被装饰的函数/类。

class B {
    // ...
}

class C {
    // ...
}

function Inject(cls) {
    return function(target) {
        target.prototype.dependency = new cls();
    }
}

@Inject(B)
class A {
    // ...
}

const a = new A();
console.log(a.dependency instanceof B)

  

 

依赖注入 (Dependency Injection, DI) vs 面向对象继承 (Inheritance)

依赖注入:

1. 更加容易地测试代码,因为你可以模拟对象的行为而不用去依赖真实的对象。

2.更好地组织代码,因为你可以建立更多的模块,这些模块中可以有多个不同的实例。

3.可以使用不同的依赖来创建不同的实例,这样就能构建出多样化的应用。

面向对象继承

1. 可以减少代码重复。当你要重复使用一些类似的功能时,可以使用面向对象继承来创建一个基类,然后使用子类来扩展这些功能。

2. 可以方便地修改代码。当你需要修改一些共同的功能时,只需要修改一个地方就可以了。

3. 可以减少开发时间。当你需要重复使用一些功能时,只需要修改一次就可以实现快速开发。

标签:es7,依赖,const,DI,prop,Dependency,模块,return,注入
From: https://www.cnblogs.com/breakdown/p/17045186.html

相关文章

  • 818 Div 2.F. Madoka and The First Session
    Problem-F-Codeforces818Div2.F.MadokaandTheFirstSession思路:不妨转化一下题意:将条件转化为:\(b_v+1,b_v+1\),然后使得其中一个-2那么在\(a\)上就是使\(a_......
  • spring boot——请求与参数校验——response重定向——response.sendRedirect("/test1
               代码:packageorg.example.controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframe......
  • [Codeforces Round #822 (Div. 2)](https://codeforces.com/contest/1734)
    CodeforcesRound#822(Div.2)ProblemF.ZerosandOnes解法定义:\(f(x)\)为在\(S\)串中位置为\(x\)的值。显然\(f(x)\in0,1\)有一重要性质:若\(f(x)\)为1,那么二进制......
  • Codeforces Round #843 (Div. 2)
    Preface难得的7点场CF,结果反而遇上了我最困的时候(吃完晚饭血糖上来就贼困,我一般反而凌晨场比较清醒)但是这场表现还可以,写的题基本都是一发入魂而且速度也比较快比较可惜......
  • 【MySQL】Loading class `com.mysql.jdbc.Driver'. This is deprecated.
    使用的mysql时,配置数据库驱动的时候报了一个这样的错:Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver'.......
  • Redis做缓存和SpringCache缓存
    记录一下Redis做缓存和SpringCache缓存的区别1.Redis做缓存的话,相当于是一个第三方缓存,所以项目重启之后缓存数据还是存在的2.SpringCache作缓存的话是建立在JVM上的,所以......
  • 《Spring in action 4》(十一)SSM + Redis
    SSM+Redis文章目录​​SSM+Redis​​​​SpringDataRedis​​​​项目整合​​​​项目结构​​​​InitWebApplication​​​​RootConfig​​​​ServletCofig.xml​......
  • Codeforces Round #843 (Div. 2)
    A-GardenerandtheCapybaras题意给出字符串S,S只由字符a,b组成,问怎么切分可以使字符串分为小大小,大小大这种的三段。思路在2~n-1的范围内找到字符a的位置,如果里......
  • Codeforces Round #843 (Div. 2)
    题目链接Atag:构造,分类讨论核心思路我们其实可以发现我们要是分很多情况去讨论abc,这题就不好做。所以我们可以假设a和b就是我们字符串的两个端点,这样题目就很好做了......
  • CF 1581B Diameter of Graph 题解
    题面:给定n个顶点,m条边,任意两点并且最大距离小于k,两个顶点只能连一条边,询问是否能构造出这样的图型思路:1.n=1时进行特判,只有k>1时成立2.m=n(n-1)/2时,是完全图,只有k......