Injector框架理解(五)

上一节我们学习了如何配置一个组件的依赖项,以及怎么配置属性组件,还有就是invoke方法的使用,今天我们继续学习依赖注入框架的另外一些知识,比如如何初始化组件。

我们先来看看instantiate方法:

const {Injector}= require('didi');

class Foo {
    constructor(abc1, baz1) {
      this.abc = abc1;
      this.baz = baz1;
    }
  }
Foo.$inject = [ 'abc', 'baz' ];

const module1 = /** @type ModuleDeclaration */ ({
    baz: [ 'value', 'baz-value' ],
    abc: [ 'value', 'abc-value' ]
});

const injector = new Injector([ module1 ]);

const result = injector.instantiate(Foo);
console.log('result instantiate:',result)

输出如下:

以上就是instantiate方法的使用,didi框架还支持父模块和子模块的使用,我们看下面的例子:

const {Injector}= require('didi');
const moduleParent = /** @type ModuleDeclaration */ ({
    a: [ 'value', 'a-parent' ]
});

const moduleChild = /** @type ModuleDeclaration */ ({
    a: [ 'value', 'a-child' ],
    d: [ 'value', 'd-child' ],
    c: ['factory', function(a) {
        return {
          a: a
        };
      } ]
});

const injector = new Injector([ moduleParent ]);
const child = injector.createChild([ moduleChild ]);

const aResult =  child.get('a');
const dResult =  child.get('d');
console.log('aResult:',aResult);
console.log('dResult:',dResult);
const cResult = child.get('c');
console.log('cResult:',cResult);

输出如下:

didi依赖注入框架还支持私有组件,请看下面的例子:

const{Injector} = require('didi');

const injector = new Injector([
    {
      __exports__: [ 'publicFoo' ],
      'publicFoo': [
        'factory',
        function(privateBar) {
          return {
            dependency: privateBar
          };
        }
      ],
      'privateBar': [ 'value', 'private-value' ]
    },
    {
      'bar': [
        'factory',
        function(privateBar) {
          return null;
        }
      ],
      'baz': [
        'factory',
        function(publicFoo) {
          return {
            dependency: publicFoo
          };
        }
      ]
    }
  ]);

  const publicFoo = injector.get('publicFoo');
  console.log('publicFoo:',publicFoo);
  //const privateBar= injector.get('privateBar');
  //console.log('privateBar:',privateBar);
  //const bar = injector.get('bar');
  //console.log('bar:',bar);
  const baz = injector.get('baz');
  console.log('baz:',baz);

输出如下:

大家注意,在这里在模块中__exports__的组件才是公有组件,这样的组件才是可以访问的,其他的组件都是私有的,访问这样的组件会抛出一个错误。注释部分的代码都会抛出错误。有了这种方式以后,我们可以更好的封装我们的模块,同时暴露应该暴露的API,隐藏一些不需要外部知道的具体实现。

 

 

 

 

 

版权声明:著作权归作者所有。

thumb_up 0 | star_outline 0 | textsms 0